Client - Server-WebSocket-handshake

Ich versuche zu implementieren, die eine einfache web-socket-server und-client. Dies ist meine erste Zeit auf der Suche nach Ihnen, also sorry, wenn diese Frage liegt auf der Hand.

Ich bin mit Chrome v15, ich glaube, Sie nutzt die 09 (version 8) - Protokoll?

Ich weiß einfach nicht scheinen, um in der Lage sein, um Sie zu verbinden. Dem Wunsch bin ich immer über den browser:

GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:8181
Sec-WebSocket-Origin: http://localhost:51990
Sec-WebSocket-Key: JFAw5PLk45TodN2ERD1ePA==
Sec-WebSocket-Version: 8
Cookie: size=4; CP.mode=B; ASP.NET_SessionId=zzx3d3ajepwwycqjaj1nyex4; .ASPXAUTH=781D3791DC2483756B3DA9FA8E031A9BACD357EBD8FA23B7BCB8BDA6526F28F77FC798A0D4BEC4E2B166700B5C08FA60CBF588D292BFC1D050C9B034522C93ACBEF28BC6D51FDC5B40F6050F03758DA1A3E4D3F7484BC4F7DA3602A5FAFD3023C8D4D5929B69F88DB417CA6F366A83F334807818E2C07E23C0D0993F25B3C9BDE02A; name=Test

Ich habe bemerkt, dass die Sec-WebSocket-Protocol header fehlt.

Die Antwort, die ich bin senden sieht wie folgt aus:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: VAuGgaNDB/reVQpGfDF8KXeZx5o=
Sec-WebSocket-Protocol: chat

Kann jemand etwas Licht auf, was ich falsch mache bitte?

BEARBEITEN: Der code, den ich verwende, um zu generieren, die übernehmen-Taste ist:

public static String ComputeWebSocketHandshakeSecurityHash09(String secWebSocketKey)
        {
            const String MagicKEY = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
            String secWebSocketAccept = String.Empty;

            //1. Combine the request Sec-WebSocket-Key with magic key.
            String ret = secWebSocketKey + MagicKEY;

            //2. Compute the SHA1 hash
            SHA1 sha = new SHA1CryptoServiceProvider();
            byte[] sha1Hash = sha.ComputeHash(Encoding.UTF8.GetBytes(ret));

            //3. Base64 encode the hash
            secWebSocketAccept = Convert.ToBase64String(sha1Hash);

            return secWebSocketAccept;
        }

BEARBEITEN: Dies ist der code der Antwort:

        StringBuilder mResponse = new StringBuilder();
        mResponse.Append("HTTP/1.1 101 Switching Protocols" + Environment.NewLine);
        mResponse.Append("Upgrade: WebSocket" + Environment.NewLine);
        mResponse.Append("Connection: Upgrade" + Environment.NewLine);
        mResponse.Append(String.Format("Sec-WebSocket-Accept: {0}", ComputeWebSocketHandshakeSecurityHash09(secKey)) + Environment.NewLine);


        //Build the response for the client
        byte[] HandshakeText = Encoding.UTF8.GetBytes(mResponse.ToString());

        logger.Log("");
        logger.Log("Sending handshake ...");

        ConnectionSocket.BeginSend(HandshakeText, 0, HandshakeText.Length, 0, HandshakeFinished, null);
  • Es sei denn, ich bin zu verkennen, Sie akzeptieren Schlüssel scheint falsch zu sein. Es sollte tixAAehY4D7GQBBUYkVMLZ3yccE= nach dem Eingang. Wie sind Sie mit der Berechnung? (Konnte Sie nach dem code, für den das bitte?)
  • ok, dachte es sich. die "Sec-WebSocket-Protocol: chat" wurde nicht in dieser version. Es verbindet sich nun aber ruft nur die onclose-Methode clientseitige, nicht auf öffnen. Irgendwelche Ideen?
  • Das passiert, wenn die Antwort nicht korrekt war, in gewisser Weise. Bist du sicher das hinzufügen von zwei CRLFs?
  • Ja, das hinzufügen Umwelt.Newline. Ich habe den code Hinzugefügt, ich bin mit den oben.
  • Rechts gibt es immer! Hab die onopen (clientseitiger) - Funktion aufrufen. Schien es braucht zwei CRLF am Ende der Reaktion. Jedoch, es nicht die Verbindung trennt, sobald es sich verbindet.
  • Es tut oder nicht trennen? Wenn es funktioniert - tut es trennen Sie beim Versand etwas oder gleich nach der onopen?
  • Sorry, es tut trennen. Erscheint nach dem Absenden einer Nachricht vom server. Ich habe versucht, das einwickeln der text mit 0x00 und 0xff.
  • Das message-Protokoll hat sich komplett verändert (die 00 ff ist von der vorherigen WebSocket-version) - ein Blick auf einige pseudocode, die ich geschrieben, die zuvor für die Decodierung client->server-Nachrichten: stackoverflow.com/q/7045885. Für server->client-Meldungen, die Sie Folgen müssen, die Spezifikation auch. Könnten Sie versuchen, das senden der bytes 81 03 61 62 63 (hex) und sehen, ob Sie erhalten "abc" auf dem client? Wenn das funktioniert poste ich einige code für server->client-Nachrichten, wenn Sie wollen.
  • Environment.Newline falsch ist, auf nicht-Windows-Plattformen. Verwenden \r\n.

InformationsquelleAutor RexMundi | 2011-11-11
Schreibe einen Kommentar