2

私は最近、HTML5 WebSocket をいじり始めました。単純な jQuery Web クライアントとコンソール アプリケーション サーバーを手に入れました。握手について読んだ後、私が現在クライアントのために持っているものは次のとおりです。

var socket = new WebSocket("ws://127.0.0.1:100", ["chat"]);
socket.onopen = function() {
    console.log(socket.readyState);
}

これにより、次がサーバーに送信されます。

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:100
Origin: http://localhost:57944
Sec-WebSocket-Protocol: chat
Pragma: no-cache
Cache-Control: no-cache
Sec-WebSocket-Key: dBQ0epP7wmgHDEJc6Me95Q==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

さて、私のサーバーコードです。

まず、クライアントから送信された上記の行を読み、Sec-WebSocket-Key値を見つけて変数に保存しますkey

次に、ウィキペディアの記事のマジック ナンバー258EAFA5-E914-47DA-95CA-C5AB0DC85B11 を追加します。これにより、次のコードが生成されます。

key = string.Concat(key, "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
using (SHA1 sha1 = SHA1.Create())
{
    byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(key));
    responseKey = Convert.ToBase64String(hash);
}

最後に、応答キーは、クライアントに送り返すメッセージの作成に使用されます。

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: u9guLPph1FeCPuOpFNs4F1b+UqY=
Sec-WebSocket-Protocol: chat
[blank line, as requested in spec]

ただし、 mysocket.readyStateは 0 から 3 になり、次のエラーで失敗しますWebSocket connection to 'ws://127.0.0.1:100/' failed:

これは、サーバーがクライアントに対して互換性のないプロトコルを使用している可能性があることを読みましたが、これが事実である場合、どこから探し始めればよいか完全にはわかりません. そうでない場合、これを修正する方法や、少し困惑しているため、詳細情報をどこで入手できるかを誰かが知っていますか.

2013 年 3 月 21 日

以下の@djcのコメントを読んだ後、サーバーコードを変更して、次のように確認を送り返しました。

using (StreamWriter sw = new StreamWriter(ns, Encoding.UTF8))
{
    sw.NewLine = "\r\n\r\n";

    // get response and calculate responseKey here (getting bytes as UTF-8 from client)

    sw.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
    sw.WriteLine("Upgrade: websocket");
    sw.WriteLine("Connection: Upgrade");
    sw.WriteLine("WebSocket-Origin: http://localhost:57944");
    sw.WriteLine("WebSocket-Location: 127.0.0.1:100");
    sw.WriteLine("Sec-WebSocket-Accept: " + responseKey);
    sw.WriteLine("");
    sw.Flush();
}

クライアントでエラーが発生することはなくなりましたが、'socket.readyState' は 0 のままで、socket.onopenブロックが起動されることはありません。

4

1 に答える 1

3

この仕様に基づいて、私は最終的にそれを機能させることができました。これが私のクライアントコードです:

var socket = new WebSocket("ws://localhost:8181/websession", ['chat','superchat']);
            
socket.onopen = function()
{
    $("div#messages").append("<p class=\"event\">Socket is connected.</p>");
    socket.send("Thanks!");
};

websessionCookie の管理と['chat','superchat']プロトコルのために を含める必要があったようです。

サーバー:

using (TcpClient client = listener.AcceptTcpClient())
using (NetworkStream stream = client.GetStream())
using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))
using (StreamWriter sw = new StreamWriter(stream, Encoding.UTF8))
{
    Dictionary<string, string> headers = new Dictionary<string, string>();
    string line = string.Empty;
    while ((line = sr.ReadLine()) != string.Empty)
    {
        string[] tokens = line.Split(new char[] { ':' }, 2);
        if (!string.IsNullOrWhiteSpace(line) && tokens.Length > 1)
        {
            headers[tokens[0]] = tokens[1].Trim();
        }
    }

    string responseKey = "";
    string key = string.Concat(headers["Sec-WebSocket-Key"], "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
    using (SHA1 sha1 = SHA1.Create())
    {
        byte[] hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(key));
        responseKey = Convert.ToBase64String(hash);
    }

    sw.WriteLine("HTTP/1.1 101 Switching Protocols");
    sw.WriteLine("Upgrade: websocket");
    sw.WriteLine("Connection: Upgrade");
    sw.WriteLine("Sec-WebSocket-Accept: " + responseKey);
    sw.WriteLine("Sec-WebSocket-Protocol: chat");
    sw.WriteLine("");
    sw.Flush();
}

今、私は有効な接続を取得していますが、サーバーとデータを送受信できません - しかし、それは私が推測する別の話です.

于 2013-03-22T08:38:18.867 に答える