私は最近、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
ブロックが起動されることはありません。