WebSocket -Server: Die Onopen -Funktion in der Web -Socket wird nie aufgerufen

StackOverflow https://stackoverflow.com/questions/2211898

  •  18-09-2019
  •  | 
  •  

Frage

Ich versuche, einen C# Web Socket -Server zu implementieren, aber es gibt mir ein paar Probleme. Ich führe einen Webserver (ASP.NET) aus, um die Seite mit dem JavaScript zu hosten, und der Web -Socket -Server wird als C# -Konsole -Anwendung implementiert.

Ich kann den Verbindungsversuch vom Client (Chrome ausführen, das das JavaScript ausführt) und den Händedruck vom Client abzurufen. Aber der Kunde scheint den Handshake, den ich zurücksende, nicht zu akzeptieren (die onopen Die Funktion in der Web -Socket wird nie aufgerufen).

Ich habe das gelesen Das Web -Socket -Protokoll Und ich kann nicht sehen, was ich falsch mache. Hier ist ein bisschen vom Servercode:

Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
IPEndPoint ep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8181);
listener.Bind(ep);
listener.Listen(100);
Console.WriteLine("Wainting for connection...");
Socket socketForClient = listener.Accept();
if (socketForClient.Connected)
{
    Console.WriteLine("Client connected");
    NetworkStream networkStream = new NetworkStream(socketForClient);
    System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(networkStream);
    System.IO.StreamReader streamReader = new System.IO.StreamReader(networkStream);

    //read handshake from client:
    Console.WriteLine("HANDSHAKING...");
    char[] shake = new char[255];
    streamReader.Read(shake, 0, 255);

    string handshake =
       "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" +
       "Upgrade: WebSocket\r\n" +
       "Connection: Upgrade\r\n" +
       "WebSocket-Origin: http://localhost:8080\r\n" +
       "WebSocket-Location: ws://localhost:8181\r\n" +
       "\r\n";

    streamWriter.Write(handshake);
    streamWriter.Flush();

Ich laufe auf Port 8080 auf dem Webserver und auf dem Web -Socket -Server auf Port 8181 beide auf meinem Localhost.

Ich habe versucht, den Handschlag in verschiedenen Codierungen zu senden (ASCII, Bytes und Hex), aber das scheint keinen Unterschied zu machen. Die Verbindung ist nie vollständig hergestellt. Das JavaScript sieht so aus:

var ws;
var host = 'ws://localhost:8181';
debug("Connecting to " + host + " ...");
try {
 ws = new WebSocket(host);
} catch (err) {
 debug(err, 'error');
}
ws.onopen = function () {
 debug("connected...", 'success');
};
ws.onclose = function () {
 debug("Socket closed!", 'error');
};
ws.onmessage = function (evt) {
 debug('response: ' + evt, 'response');
};

Ich vermute, dass der Fehler auf dem C# -Server liegt, da Chrome die Informationen so sendet, wie sie sollten, aber als gesagt die onopen Funktion wird nie aufgerufen.

Also meine Frage kurz:Hat einer von euch das jemals erreicht - und wenn ja, wie haben Sie das gemacht? Und aus Grund: Sehen Sie offensichtliche Fehler im Code (Hoffnung, dass das nicht viel zu fragen ist)

War es hilfreich?

Lösung

Wahrscheinlich ist es ein Codierungsproblem. Hier ist ein funktionierender C# -Server, den ich geschrieben habe:

class Program
{
    static void Main(string[] args)
    {
        var listener = new TcpListener(IPAddress.Loopback, 8181);
        listener.Start();
        using (var client = listener.AcceptTcpClient())
        using (var stream = client.GetStream())
        using (var reader = new StreamReader(stream))
        using (var writer = new StreamWriter(stream))
        {
            writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
            writer.WriteLine("Upgrade: WebSocket");
            writer.WriteLine("Connection: Upgrade");
            writer.WriteLine("WebSocket-Origin: http://localhost:8080");
            writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
            writer.WriteLine("");
        }
        listener.Stop();
    }
}

Und der entsprechende Kunde veranstaltet auf localhost:8080:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <script type="text/javascript">
      var socket = new WebSocket('ws://localhost:8181/websession');
      socket.onopen = function() {
        alert('handshake successfully established. May send data now...');
      };
      socket.onclose = function() {
        alert('connection closed');
      };
    </script>
  </head>
  <body>
  </body>
</html>

Dieses Beispiel legt nur den Handschlag fest. Sie müssen den Server optimieren, um weiterhin Daten zu akzeptieren, sobald der Handschlag festgelegt wurde.

Andere Tipps

Bitte verwenden Sie die UTF8 -Codierung, um eine Textnachricht zu senden.

Es gibt einen Open Source WebSocket -Server, der von C#implementiert wird. Sie können ihn direkt verwenden.

http://superwebsocket.codeplex.com/

Es ist mein Open -Source -Projekt!

Das .NET Framework 4.5 bietet Unterstützung für Websockets in der Windows Communication Foundation. WebSockets ist eine effiziente, standardbasierte Technologie, die die bidirektionale Kommunikation über die Standard-HTTP-Ports 80 und 443 ermöglicht. Die Verwendung der Standard-HTTP-Ports ermöglicht es Websockets, über Intermediäre über das Web zu kommunizieren. Es wurden zwei neue Standardbindungen hinzugefügt, um die Kommunikation über einen WebSocket -Transport zu unterstützen. Nethttpbinding und nethttpsbinding. WebSockets-spezifische Einstellungen können im Element httptransportbinding konfiguriert werden, indem Sie auf die WebSocketSettings-Eigenschaft zugreifen.

Ich denke, es verwendet immer noch Seife

http://msdn.microsoft.com/en-us/library/hhh674271(v=vs.110).aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top