Ich verstehe nicht, warum ich den folgenden Code nicht zum Laufen bringen kann. Ich möchte mit JavaScript eine Verbindung zu meiner Serverkonsolenanwendung herstellen. Und dann senden Sie Daten an den Server.
Hier ist der Servercode:
static void Main(string[] args)
{
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 9998);
server.Start();
var client = server.AcceptTcpClient();
var stream = client.GetStream();
while (true)
{
var buffer = new byte[1024];
// wait for data to be received
var bytesRead = stream.Read(buffer, 0, buffer.Length);
var r = System.Text.Encoding.UTF8.GetString(buffer);
// write received data to the console
Console.WriteLine(r.Substring(0, bytesRead));
}
}
und hier ist das JavaScript:
var ws = new WebSocket("ws://localhost:9998/service");
ws.onopen = function () {
ws.send("Hello World"); // I WANT TO SEND THIS MESSAGE TO THE SERVER!!!!!!!!
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
alert("Message is received...");
};
ws.onclose = function () {
// websocket is closed.
alert("Connection is closed...");
};
Wenn ich diesen Code ausführe, passiert Folgendes:
Beachten Sie, dass der Server beim Ausführen von JavaScript eine Verbindung akzeptiert und erfolgreich herstellt. JavaScript kann jedoch keine Daten senden. Immer wenn ich die Sendemethode platziere, wird sie nicht gesendet, obwohl eine Verbindung hergestellt wurde. Wie kann ich das zum Laufen bringen?
c#
javascript
websocket
Tono Nam
quelle
quelle
Antworten:
WebSockets ist ein Protokoll, das auf einer TCP-Streaming-Verbindung basiert. Obwohl WebSockets ein nachrichtenbasiertes Protokoll ist.
Wenn Sie Ihr eigenes Protokoll implementieren möchten, empfehle ich die Verwendung der neuesten und stabilsten Spezifikation (für 18/04/12) RFC 6455 . Diese Spezifikation enthält alle erforderlichen Informationen zu Handshake und Framing. Ebenso die meisten Beschreibungen zu Szenarien des Verhaltens sowohl von der Browserseite als auch von der Serverseite. Es wird dringend empfohlen, bei der Implementierung Ihres Codes die Empfehlungen zur Serverseite zu befolgen.
In wenigen Worten würde ich die Arbeit mit WebSockets folgendermaßen beschreiben:
Erstellen Sie einen Server-Socket (System.Net.Sockets), binden Sie ihn an einen bestimmten Port und überwachen Sie die asynchrone Annahme von Verbindungen. Sowas in der Art:
Sie sollten die Akzeptanzfunktion "OnAccept" haben, die den Handshake implementiert. In Zukunft muss es sich in einem anderen Thread befinden, wenn das System eine große Anzahl von Verbindungen pro Sekunde verarbeiten soll.
Nachdem die Verbindung hergestellt wurde, müssen Sie einen Handshake durchführen . Basierend auf Spezifikation 1.3 Opening Handshake erhalten Sie nach dem Herstellen der Verbindung eine grundlegende HTTP-Anfrage mit einigen Informationen. Beispiel:
Dieses Beispiel basiert auf der Version von Protokoll 13. Beachten Sie, dass ältere Versionen einige Unterschiede aufweisen, die meisten neuesten Versionen jedoch kreuzkompatibel sind. Verschiedene Browser senden Ihnen möglicherweise zusätzliche Daten. Zum Beispiel Browser- und Betriebssystemdetails, Cache und andere.
Basierend auf den bereitgestellten Handshake-Details müssen Sie Antwortzeilen generieren. Diese sind größtenteils identisch, enthalten jedoch den Accpet-Key, der auf dem bereitgestellten Sec-WebSocket-Key basiert. In Spezifikation 1.3 wird klar beschrieben, wie ein Antwortschlüssel generiert wird. Hier ist meine Funktion, die ich für V13 verwendet habe:
Die Handshake-Antwort sieht so aus:
Der Akzeptanzschlüssel muss jedoch der generierte sein, der auf dem vom Client bereitgestellten Schlüssel und der zuvor von mir bereitgestellten Methode AcceptKey basiert. Stellen Sie außerdem sicher, dass Sie nach dem letzten Zeichen der Akzeptiertaste zwei neue Zeilen "\ r \ n \ r \ n" einfügen.
Die Implementierung eines eigenen WebSockets-Protokolls hat definitiv einige Vorteile und großartige Erfahrungen sowie die Kontrolle über das Protokoll selbst. Sie müssen jedoch einige Zeit damit verbringen und sicherstellen, dass die Implementierung äußerst zuverlässig ist.
Gleichzeitig können Sie sich gebrauchsfertige Lösungen ansehen, die Google (wieder) bietet.
quelle
(Antwort im Namen des OP veröffentlicht) .
Ich kann jetzt Daten senden. Dies ist meine neue Version des Programms dank Ihrer Antworten und des Codes von @Maksims Mihejevs.
Server
JavaScript:
Wenn ich diesen Code ausführe, kann ich Daten sowohl vom Client als auch vom Server senden und empfangen. Das einzige Problem ist, dass die Nachrichten verschlüsselt werden, wenn sie auf dem Server ankommen. Hier sind die Schritte zur Ausführung des Programms:
Beachten Sie, wie die Nachricht vom Client verschlüsselt wird.
quelle
WebSockets werden mit einem Protokoll implementiert , das einen Handshake zwischen Client und Server beinhaltet . Ich kann mir nicht vorstellen, dass sie wie normale Steckdosen funktionieren. Informieren Sie sich über das Protokoll und lassen Sie Ihre Anwendung darüber sprechen. Verwenden Sie alternativ eine vorhandene WebSocket-Bibliothek oder .Net4.5beta mit einer WebSocket-API .
quelle
Ich konnte nirgendwo ein einfaches Arbeitsbeispiel finden (Stand: 19. Januar), daher hier eine aktualisierte Version. Ich habe Chrome Version 71.0.3578.98.
C # Websocket-Server:
Client HTML und Javascript:
quelle
Problem
Da Sie WebSocket verwenden, ist spender korrekt. Nachdem Sie die anfänglichen Daten vom WebSocket erhalten haben, müssen Sie die Handshake-Nachricht vom C # -Server senden, bevor weitere Informationen fließen können.
Etwas in diese Richtung.
Sie können weitere Untersuchungen zur Funktionsweise von WebSocket unter w3 oder google durchführen.
Links und Ressourcen
Hier ist eine Protokollspezifikation: http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76#section-1.3
Liste der Arbeitsbeispiele:
quelle