Heim >Backend-Entwicklung >C#.Net-Tutorial >Ausführliche Erläuterung von Beispielen für die Implementierung von serverseitigem WebSocket-Instant Messaging mithilfe von .NET

Ausführliche Erläuterung von Beispielen für die Implementierung von serverseitigem WebSocket-Instant Messaging mithilfe von .NET

Y2J
Y2JOriginal
2017-05-04 11:12:176663Durchsuche

In diesem Artikel werden hauptsächlich Beispiele für die Implementierung von Instant Messaging und WebSocket-Servern in .NET vorgestellt. Der Herausgeber findet es recht gut, daher werde ich es jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Herausgeber und werfen wir einen Blick auf

Gängige Methoden für Instant Messaging

1. Es gibt zahlreiche Plattformen von Drittanbietern wie Google und Tencent Huanxin, darunter Google Instant Messenger, ist kostenlos, aber kostenlos bedeutet kostenlos und nicht einfach zu verwenden. Einige andere Drittanbieter erheben im Allgemeinen eine Gebühr und die Nutzungsanforderungen begrenzen den Datenfluss (1 Sekunde/maximal x Nachrichten) oder begrenzen die Anzahl der Benutzer.

Aber die Stabilität ist nicht schlecht und es kann den Servicedruck verringern

2. Außerdem kann es einen besseren Server schreiben. Es wurde vor .NET 4.5 häufiger verwendet und war umständlich zu verwenden. Es ist notwendig, die Datenpakete und andere Vorgänge zu analysieren (aber es scheint, dass es Methoden zur Verarbeitung extrem langer Pakete im Internet gibt)

3. System.Net.WebSockets.WebSocket, das ist etwas, das gekommen ist aus .NET 4.5 und ist sehr nützlich für die Serverumgebung. Es gibt auch Anforderungen, IIS8 und höher. Das bedeutet, dass der mit Windows Server 2008R2 gelieferte IIS dies nicht unterstützt, der mit Windows 8 und Server 2012 oder höher gelieferte IIS jedoch schon. Dieser Artikel beschreibt hauptsächlich die Beispiele dieser Methode

Der vollständige Prozess

1). Der Code lautet wie folgt:

ws = new WebSocket('ws://' + window.location.hostname + ':' + window.location.port + '/Handler1.ashx?user=' + $ ("#user" ).val());


2. Der Server erhält das Verbindungsobjekt

und speichert es im Verbindungspool

3). Verbindungsobjekt. Beginnen Sie mit dem Abhören (jeder Client und Server speichert lange Links). ;

CONNECT_POOL.Add(user, socket);

4). Client A sendet eine Nachricht an B

5). >6) Analysieren Sie den Nachrichtentext (B | Hallo, ich bin A) und rufen Sie die Empfänger-ID ab, suchen Sie im Verbindungspool nach dem Serververbindungsobjekt von B und senden Sie die Nachricht über das Verbindungsobjekt von B an den B-Client


7). Server A überwacht weiterhin

Der Code lautet wie folgt:
ws.send($("#to").val() + "|" + $('#content').val());

8). 🎜>
string userMsg = Encoding.UTF8.GetString(buffer.Array, 0, result.Count);

Das Folgende ist der vollständige Code

WebSocket destSocket = CONNECT_POOL[descUser];
await destSocket.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None);

Client-Teil

Der Client ist äußerst einfach und verwendet WebSocket direkt Überwacht dann mehrere
WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None);
Ereignisse von WebSocket

Es ist in Ordnung. Beim Herstellen einer Verbindung können Sie die ID des aktuellen Connectors (Benutzernummer) übergeben und beim Senden einer Nachricht die Methode „Empfänger-ID | Ich bin der Nachrichteninhalt“ verwenden, z. B. „A | Hallo A, ich bin B!“ "

ws.onmessage = function (evt) {

  $(&#39;#msg&#39;).append(&#39;<p>&#39; + evt.data + &#39;</p>&#39;);
}
Es gibt jedoch immer noch einige häufige Szenarien, die bei der Verwendung mobiler Endgeräte bewältigt werden müssen

1: Schalten Sie den Telefonbildschirm aus. Wenn IOS den Bildschirm ausschaltet, geht WebSocket sofort verloren

AndroidEs wird eine Weile warten, bevor die Verbindung unterbrochen wird. Der Server kann den Verbindungsverlust erkennen

2: Das Netzwerk ist instabil und WebSocket verliert die Verbindung nicht sofort, wenn die Netzwerkverbindung getrennt wird, und der Server kann es nicht erkennen. (Sie können auf der Serverseite einen Heartbeat-Mechanismus entwerfen, um regelmäßig Nachrichten an Benutzer im Verbindungspool zu senden, um zu erkennen, ob Benutzer Verbindungen aufrechterhalten)

3: Andere usw. (plötzliches Herunterfahren, Ende der Anwendung in der Hintergrund)

Egal welcher, der Client kann zuerst den

Status

von ws ermitteln, wenn er eine Nachricht sendet (oder die Netzwerkverbindung wiederhergestellt wird oder der Bildschirm eingeschaltet wird). Befindet sich nicht im verbundenen Zustand, muss die Verbindung erneut hergestellt werden (einfach neu herunterladen)

Serverseitiger Teil

Die Serverseite verwendet Handler (Web

API

kann ebenfalls verwendet werden, hauptsächlich unter Verwendung der WebSocket-Klasse. Es gibt relativ detaillierte Kommentare im Code. Hier sind nur einige Probleme, die Aufmerksamkeit erfordern




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


 



目的用户

1: Dictionary887d398c39979ad0022cb8187296860e> : Offline-Nachrichtenpool. Wenn A->B eine Nachricht sendet und B aus irgendeinem Grund derzeit nicht online ist (plötzliche Netzwerkunterbrechung/schwarzer Bildschirm usw.), wird die Nachricht zuerst gespeichert (2 Tage) und die Offline-Nachricht von B wird sofort gespeichert nachdem B verbunden ist. (2: MessageInfo: Offline-Entität. Zeichnen Sie die Zeit und den Inhalt der aktuellen Offline-Nachricht auf)

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen für die Implementierung von serverseitigem WebSocket-Instant Messaging mithilfe von .NET. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn