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);
WebSocket destSocket = CONNECT_POOL[descUser]; await destSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
ws.onmessage = function (evt) { $('#msg').append('<p>' + evt.data + '</p>'); }
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)
<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
API peut é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 : Dictionnaire
2 : Dictionary
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!