


Exemple d'introduction du flux d'octets protobuf de transmission de socket
L'article précédent parlait du traitement des données. Cet article parle principalement de l'utilisation du multi-thread pour envoyer et recevoir des messages
//创建消息数据模型 2 //正式项目中,消息的结构一般是消息长度+消息id+消息主体内容 3 public class Message 4 { public IExtensible protobuf; public int messageId; 7 } 8 9 public class SocketClientTemp : MonoBehaviour 10 { 11 const int packageMaxLength = 1024; 12 13 Socket mSocket; 14 Thread threadSend; 15 Thread threadRecive; 16 Queue<Message> allMessages = new Queue<Message>(); 17 Queue<byte[]> sendQueue = new Queue<byte[]>(); public bool Init() 20 { 21 //创建一个socket对象 22 mSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 23 return SocketConnection("此处是ip", 1111); 24 } 25 26 void Update() 27 { 28 AnalysisMessage(); 29 } 30 31 /// <summary> 32 /// 建立服务器连接 33 /// </summary> 34 /// <param name="ip">服务器的ip地址</param> 35 /// <param name="port">端口</param> 36 bool SocketConnection(string ip, int port) 37 { 38 try 39 { 40 IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(ip), port); 41 //同步连接服务器,实际使用时推荐使用异步连接,处理方式会在下一篇讲断线重连时讲到 42 mSocket.Connect(ipep); 43 //连接成功后,创建两个线程,分别用于发送和接收消息 44 threadSend = new Thread(new ThreadStart(SendMessage)); 45 threadSend.Start(); 46 threadRecive = new Thread(new ThreadStart(ReceiveMessage)); 47 threadRecive.Start(); 48 return true; 49 } 50 catch (Exception e) 51 { 52 Debug.Log(e.ToString()); 53 Close(); 54 return false; 55 } } #region ...发送消息 59 /// <summary> 60 /// 添加数据到发送队列 61 /// </summary> 62 /// <param name="protobufModel"></param> 63 /// <param name="messageId"></param> 64 public void AddSendMessageQueue(IExtensible protobufModel, int messageId) 65 { 66 sendQueue.Enqueue(BuildPackage(protobufModel, messageId)); 67 } void SendMessage() 70 { 71 //循环获取发送队列中第一个数据,然后发送到服务器 72 while (true) 73 { 74 if (sendQueue.Count == 0) 75 { 76 Thread.Sleep(100); 77 continue; 78 } 79 if (!mSocket.Connected) 80 { 81 Close(); 82 break; 83 } 84 else 85 Send(sendQueue.Peek()); //发送队列中第一条数据 86 } 87 } 88 89 void Send(byte[] bytes) 90 { 91 try 92 { 93 mSocket.Send(bytes, SocketFlags.None); 94 //发送成功后,从发送队列中移除已发送的消息 95 sendQueue.Dequeue(); 96 } 97 catch (SocketException e) 98 { 99 //如果错误码为10035,说明服务器缓存区满了,所以等100毫秒再次发送100 if (e.NativeErrorCode == 10035)101 {102 Thread.Sleep(100);103 Send(bytes);104 }105 else106 Debug.Log(e.ToString());107 }108 }109 #endregion110 111 #region ...接收消息112 /// <summary>113 /// 解析收到的消息114 /// </summary>115 void AnalysisMessage()116 {117 while (allMessages.Count > 0)118 {119 int id = allMessages.Dequeue().messageId;120 switch (id)121 {122 //根据消息id做不同的处理123 }124 }125 }126 127 /// <summary>128 /// 接收数据129 /// </summary>130 void ReceiveMessage()131 {132 while (true)133 {134 if (!mSocket.Connected)135 break;136 byte[] recvBytesHead = GetBytesReceive(4);137 int bodyLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(recvBytesHead, 0));138 byte[] recvBytesBody = GetBytesReceive(bodyLength);139 140 byte[] messageId = new byte[4];141 Array.Copy(recvBytesBody, 0, messageId, 0, 4);142 byte[] messageBody = new byte[bodyLength - 4];143 Array.Copy(recvBytesBody, 4, messageBody, 0, bodyLength - 4);144 145 if (BitConverter.IsLittleEndian)146 Array.Reverse(messageId);147 FillAllPackages(BitConverter.ToInt32(messageId, 0), messageBody);148 } } /// <summary>152 /// 填充接收消息队列153 /// </summary>154 /// <param name="messageId"></param>155 /// <param name="messageBody"></param>156 void FillAllPackages(int messageId, byte[] messageBody)157 {158 switch (messageId)159 {160 //根据消息id处理消息,并添加到接收消息队列161 case 1:162 allMessages.Enqueue(new Message() 163 {164 protobuf = ProtobufSerilizer.DeSerialize<TestTemp>(messageBody), 165 messageId = messageId 166 });167 break;168 }169 }170 171 /// <summary>172 /// 接收数据并处理173 /// </summary>174 /// <param name="length"></param>175 /// <returns></returns>176 byte[] GetBytesReceive(int length)177 {178 byte[] recvBytes = new byte[length];179 while (length > 0)180 {181 byte[] receiveBytes = new byte[length < packageMaxLength ? length : packageMaxLength];182 int iBytesBody = 0;183 if (length >= receiveBytes.Length)184 iBytesBody = mSocket.Receive(receiveBytes, receiveBytes.Length, 0);185 else186 iBytesBody = mSocket.Receive(receiveBytes, length, 0);187 receiveBytes.CopyTo(recvBytes, recvBytes.Length - length);188 length -= iBytesBody;189 }190 return recvBytes;191 }192 #endregion193 194 /// <summary>195 /// 构建消息数据包196 /// </summary>197 /// <param name="protobufModel"></param>198 /// <param name="messageId"></param>199 byte[] BuildPackage(IExtensible protobufModel, int messageId)200 {201 byte[] b;202 if (protobufModel != null)203 b = ProtobufSerilizer.Serialize(protobufModel);204 else205 b = new byte[0];206 //消息长度(int数据,长度4) + 消息id(int数据,长度4) + 消息主体内容207 ByteBuffer buf = ByteBuffer.Allocate(b.Length + 4 + 4);208 //消息长度 = 消息主体内容长度 + 消息id长度209 buf.WriteInt(b.Length + 4);210 buf.WriteInt(messageId);211 212 if (protobufModel != null)213 buf.WriteBytes(b);214 return buf.GetBytes();215 }216 217 void OnDestroy()218 {219 //停止运行后,如果不关闭socket多线程,再次运行时,unity会卡死220 Close();221 }222 223 /// <summary>224 /// 关闭socket,终止线程225 /// </summary>226 public void Close()227 {228 if (mSocket != null)229 {230 //微软官方推荐在关闭socket前先shutdown,但是经过测试,发现网络断开后,shutdown会无法执行231 if (mSocket.Connected)232 mSocket.Shutdown(SocketShutdown.Both);233 mSocket.Close();234 mSocket = null;235 }236 //关闭线程237 if (threadSend != null)238 threadSend.Abort();239 if (threadRecive != null)240 threadRecive.Abort();241 threadSend = null;242 threadRecive = null;243 }244 }
À ce stade, l'utilisation de sockets pour traiter l'envoi. et la réception des messages est pratiquement terminée. Cependant, afin d'améliorer l'expérience, certains projets peuvent également ajouter la fonction de déconnexion et de reconnexion. Cette fonction sera abordée dans le prochain article
.Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Cet article vous apporte des connaissances pertinentes sur php+socket, qui présente principalement le multiplexage IO et comment php+socket implémente le serveur Web ? Les amis intéressés peuvent jeter un œil ci-dessous. J'espère que cela sera utile à tout le monde.

1. Programmation de socket basée sur le protocole TCP 1. Le flux de travail du socket commence par le côté serveur. Le serveur initialise d'abord le Socket, puis se lie au port, écoute le port, appelle accepter pour bloquer et attend que le client se connecte. A ce moment, si un client initialise un Socket puis se connecte au serveur (connect), si la connexion réussit, la connexion entre le client et le serveur est établie. Le client envoie une demande de données, le serveur reçoit la demande et traite la demande, puis envoie les données de réponse au client, le client lit les données et ferme enfin la connexion. Utilisez le code Python suivant pour l'implémenter. : importations

Ce site a rapporté le 16 octobre que les premiers produits de « Unity Engine », Unity Engine Genesis Edition et Unity Engine Car Edition, avaient officiellement lancé des activités de tests internes. C'est la première fois que « Unity Engine » mène une activité à petite échelle. tests internes pour les développeurs. Période de test : du 16 octobre 2023 au 31 décembre 2023. Ce site a remarqué que Unity Engine est la version chinoise du moteur Unity lancée par l'équipe R&D d'Unity China. Basé sur Unity2022LTS, il a lancé la solution de mini-jeu WeChat et la version voiture et machine Unity Engine. Solution WeChat Mini Game Unity Engine a lancé une solution unique WeChat Mini Game Afin de mieux prendre en charge le développement de WeChat Mini Game (adaptation de l'environnement, optimisation des performances), des objectifs exclusifs WeChat Mini Game ont été ajoutés.

La première étape du côté de SpringBoot consiste à introduire les dépendances. Nous devons d'abord introduire les dépendances requises pour WebSocket, ainsi que les dépendances pour le traitement du format de sortie com.alibabafastjson1.2.73org.springframework.bootspring-boot-starter-websocket. La deuxième étape consiste à créer la classe de configuration WebSocket importorg springframework.context.annotation.Bean;importorg.springframework.context.annotation.Config.

Solution au problème selon lequel le socket php ne peut pas être connecté : 1. Vérifiez si l'extension de socket est activée dans php ; 2. Ouvrez le fichier php.ini et vérifiez si « php_sockets.dll » est chargé ; 3. Décommentez « php_sockets.dll » ; ".

Avec le développement d'Internet, le transfert de fichiers est devenu un élément indispensable du travail et du divertissement quotidien des gens. Cependant, les méthodes traditionnelles de transfert de fichiers telles que les pièces jointes aux e-mails ou les sites Web de partage de fichiers présentent certaines limites et ne peuvent pas répondre aux besoins de temps réel et de sécurité. Par conséquent, utiliser la technologie PHP et Socket pour réaliser un transfert de fichiers en temps réel est devenu une nouvelle solution. Cet article présentera les principes techniques, les avantages et les scénarios d'application de l'utilisation de la technologie PHP et Socket pour réaliser un transfert de fichiers en temps réel, et démontrera la méthode de mise en œuvre de cette technologie à travers des cas spécifiques. technologie

Problèmes courants de communication réseau et de sécurité et solutions en C# À l'ère d'Internet d'aujourd'hui, la communication réseau est devenue un élément indispensable du développement logiciel. En C#, nous rencontrons généralement certains problèmes de communication réseau, tels que la sécurité de la transmission des données, la stabilité de la connexion réseau, etc. Cet article abordera en détail les problèmes courants de communication réseau et de sécurité en C# et fournira les solutions correspondantes et des exemples de code. 1. Problèmes de communication réseau Interruption de la connexion réseau : pendant le processus de communication réseau, la connexion réseau peut être interrompue, ce qui peut entraîner

Problèmes de sécurité du programme Unity3D Problèmes de sécurité du code Le fichier d'assemblage principal Assembly-CSharp.dll du programme Unity3D est un format de fichier .NET standard et est livré avec des informations de métadonnées riches telles que les noms de méthodes, les noms de classe, les définitions de type, etc. Vous pouvez utilisez des outils tels que DnSpy pour Il peut être facilement décompilé et falsifié, et la logique du code, les noms de classe, les noms de méthodes, etc. peuvent être vus en un coup d'œil. Une fois la logique du code décompilée, il est facile de créer différents types de plug-ins et de détruire l'équilibre du jeu. S'il y a des failles dans la logique du code, il est facile de les découvrir et de les exploiter, ce qui peut entraîner des pertes imprévisibles. développeurs. Problèmes de sécurité des ressources : pendant la phase de compilation et de packaging, le programme Unity3D regroupera les ressources dans AssetBun via l'éditeur Unity.
