Maison > Article > développement back-end > Explication détaillée d'exemples d'implémentation de la messagerie instantanée côté serveur WebSocket à l'aide de .NET
Cet article présente principalement .NET pour implémenter des exemples de messagerie instantanée et de serveur WebSocket. L'éditeur pense que c'est plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur pour y jeter un œil
Méthodes courantes de messagerie instantanée
1 Il existe de nombreuses plateformes tierces telles que Google et Tencent Huanxin, parmi lesquels Google Instant Messenger est gratuit, mais gratuit signifie gratuit et pas facile à utiliser. Certains autres tiers facturent généralement des frais et les exigences d'utilisation limitent le flux (1 s/limite de x messages) ou limitent le nombre d'utilisateurs.
Mais la stabilité n'est pas mauvaise, et cela peut soulager la pression de service
2 System.Net.Sockets.Socket, et il peut également écrire un meilleur serveur. Il était davantage utilisé avant .NET 4.5 et était fastidieux à utiliser. Il est nécessaire d'analyser les paquets de données et d'autres opérations (mais il semble qu'il existe des méthodes pour traiter les paquets ultra-longs sur Internet)
3 System.Net.WebSockets.WebSocket, c'est quelque chose qui est venu. sur .NET 4.5, et est très utile pour l'environnement serveur. Il existe également des exigences, IIS8 et supérieur. Cela signifie que l'IIS fourni avec Windows Server2008R2 ne le prend pas en charge, mais que l'IIS fourni avec Windows 8 et Server2012 ou supérieur le prend en charge. Cet article décrit principalement les exemples de cette méthode
Le processus complet
1) La connexion à la demande du client
La connexion le code est le suivant :
ws = new WebSocket('ws://' + window.location.hostname + ':' + window.location.port + '/Handler1.ashx?user=' + $ ("#user").val());
2). Le serveur obtient l'objet de connexion et le stocke dans le pool de connexion
CONNECT_POOL.Add(user, socket);
3). Objet de connexion Commencez à écouter (chaque client et serveur enregistre les liens longs)
Le code est le suivant :
Résultat WebSocketReceiveResult = wait socket.ReceiveAsync(buffer, CancellationToken.None) ;
4). Le client A envoie un message à B
ws.send($("#to").val() + "|" + $('#content').val());
5). L'objet de connexion du serveur A écoute le message de A
string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);6). Analyser le message Le corps (B | Bonjour, je suis A) obtient l'ID du destinataire, recherche l'objet de connexion au serveur de B dans le pool de connexions en fonction de l'ID du récepteur et transmet le message au client B via l'objet de connexion de B.
WebSocket destSocket = CONNECT_POOL[descUser]; await destSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);7). Le serveur A objet de connexion continue de surveiller Le code est le suivant :
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);8). 🎜>Ce qui suit est le code complet
ws.onmessage = function (evt) { $('#msg').append('<p>' + evt.data + '</p>'); }Partie client
Le client est extrêmement simple, dans des circonstances normales, il utilise directement WebSocket, et puis surveille plusieurs
événements de WebSocketC'est ok. Lors de la connexion, vous pouvez transmettre l'ID du connecteur actuel (numéro d'utilisateur), et lors de l'envoi d'un message, utiliser la méthode "ID du récepteur|Je suis le contenu du message", telle que "A|Bonjour A, je suis B ! "Cependant, il existe encore certains scénarios courants qui doivent être traités lors de l'utilisation de terminaux mobiles
1 : Éteignez l'écran du téléphone mobile. Lorsque IOS éteint l'écran, le WebSocket perdra immédiatement la connexion
AndroidIl attendra un moment avant de perdre la connexion. Le serveur peut détecter la perte de connexion2 : Le réseau est instable et WebSocket ne perdra pas la connexion immédiatement si le réseau est déconnecté, et le serveur ne peut pas le savoir. (Vous pouvez concevoir un mécanisme de battement de coeur côté serveur pour envoyer régulièrement des messages aux utilisateurs du pool de connexions afin de détecter si les utilisateurs maintiennent les connexions)
3 : Autres, etc... (arrêt brutal, fin d'application dans l'arrière-plan)
Peu importe lequel, le client peut d'abord déterminer le
statutde ws lors de l'envoi d'un message (ou la connexion réseau est rétablie ou l'écran est allumé si c'est le cas). n'est pas dans l'état connecté, il doit se reconnecter (il suffit de télécharger un nouveau)
Partie côté serveur<script> var ws; $().ready(function () { $('#conn').click(function () { ws = new WebSocket('ws://' + window.location.hostname + ':' + window.location.port + '/Handler1.ashx?user=' + $("#user").val()); $('#msg').append('<p>正在连接</p>'); ws.onopen = function () { $('#msg').append('<p>已经连接</p>'); } ws.onmessage = function (evt) { $('#msg').append('<p>' + evt.data + '</p>'); } ws.onerror = function (evt) { $('#msg').append('<p>' + JSON.stringify(evt) + '</p>'); } ws.onclose = function () { $('#msg').append('<p>已经关闭</p>'); } }); $('#close').click(function () { ws.close(); }); $('#send').click(function () { if (ws.readyState == WebSocket.OPEN) { ws.send($("#to").val() + "|" + $(&#39;#content&#39;).val()); } else { $('#tips').text('连接已经关闭'); } }); }); </script>
目的用户
Le côté serveur utilise Handler (Web
APIpeut également être utilisée), principalement en utilisant la classe WebSocket . Il y a des commentaires relativement détaillés dans le code. Voici quelques problèmes qui nécessitent une attention particulière 1 : Dictionnaire06f0454b88eb565f354426b6933e3e6e Lors de la demande du gestionnaire, l'ID utilisateur du connecteur actuel sera transmis. Le serveur conserve tous les ID utilisateur connectés et l'objet de connexion WebSocket de l'utilisateur actuel
2 : Dictionary4cbd2b4693e407669a7a5cf742c2749d> : Pool de messages hors ligne. Si A->B envoie un message et que B n'est actuellement pas en ligne pour une raison quelconque (déconnexion soudaine du réseau/écran noir, etc.), le message sera enregistré en premier (2 jours) et le message hors ligne de B sera immédiatement enregistré. une fois que B est connecté, poussez-le vers lui. (2 : MessageInfo : Entité hors ligne. Enregistrez l'heure et le contenu du message hors ligne actuel)
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!