Explication détaillée d'exemples d'implémentation de la messagerie instantanée côté serveur WebSocket à l'aide de .NET

Y2J
Libérer: 2017-05-04 11:12:17
original
6609 Les gens l'ont consulté

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);
Copier après la connexion

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());
Copier après la connexion

5). L'objet de connexion du serveur A écoute le message de A

string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);
Copier après la connexion
<🎜. >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);
Copier après la connexion
7). Le serveur A objet de connexion continue de surveiller

Le code est le suivant :

WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
Copier après la connexion
8). 🎜>

Ce qui suit est le code complet
ws.onmessage = function (evt) {

  $(&#39;#msg&#39;).append(&#39;<p>&#39; + evt.data + &#39;</p>&#39;);
}
Copier après la connexion

Partie client

Le client est extrêmement simple, dans des circonstances normales, il utilise directement WebSocket, et puis surveille plusieurs

événements de WebSocket

C'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

Android

Il 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

statut

de 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 () {
  $(&#39;#conn&#39;).click(function () {
  ws = new WebSocket(&#39;ws://&#39; + window.location.hostname + &#39;:&#39; + window.location.port + &#39;/Handler1.ashx?user=&#39; + $("#user").val());
  $(&#39;#msg&#39;).append(&#39;<p>正在连接</p>&#39;);

  ws.onopen = function () {
   $(&#39;#msg&#39;).append(&#39;<p>已经连接</p>&#39;);
  }
  ws.onmessage = function (evt) {
   $(&#39;#msg&#39;).append(&#39;<p>&#39; + evt.data + &#39;</p>&#39;);
  }
  ws.onerror = function (evt) {
   $(&#39;#msg&#39;).append(&#39;<p>&#39; + JSON.stringify(evt) + &#39;</p>&#39;);
  }
  ws.onclose = function () {
   $(&#39;#msg&#39;).append(&#39;<p>已经关闭</p>&#39;);
  }
  });

  $(&#39;#close&#39;).click(function () {
  ws.close();
  });

  $(&#39;#send&#39;).click(function () {
  if (ws.readyState == WebSocket.OPEN) {
   ws.send($(&quot;#to&quot;).val() + &quot;|&quot; + $(&amp;#39;#content&amp;#39;).val());
  }
  else {
   $(&#39;#tips&#39;).text(&#39;连接已经关闭&#39;);
  }
  });

 });
 </script>


 



目的用户

Copier après la connexion
Partie côté serveur

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 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 : Dictionary> : 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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!