WebSocketは初めてです。このテーマに関する多くの情報を読み、ハンドシェイクの部分を処理するためだけに単純なサーバーを構築しようとしていますが、それでもサーバーを正しく動作させることができません。クライアントはリクエストを送信し、サーバーはクライアントにレスポンスを送り返しますが、WebSocketのonopenイベントは発生しません。しかし、サーバーを閉じると、websocketオブジェクトはoncloseイベントを発生させます。
Chromeからのリクエストは次のとおりです。
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 192.168.0.164:3215
Origin: http://lalala
Sec-WebSocket-Key: MyUY7duPdE1WbGXPOslYzw==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame
私が送り返す応答:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: 4IVZgO4OosW/b7upp7Qbh2q6a4I=
サーバーで使用しているコード:
static void Main(string[] args)
{
var listener = new TcpListener(IPAddress.Parse("192.168.0.164"), 3215);
listener.Start();
Console.WriteLine(">> Started.");
var client = listener.AcceptTcpClient();
Console.WriteLine(">> Accepted.");
while (true)
{
try
{
var stream = client.GetStream();
var bytes = new byte[client.ReceiveBufferSize];
stream.Read(bytes, 0, client.ReceiveBufferSize);
var data = Encoding.ASCII.GetString(bytes);
Console.WriteLine(data.Remove(data.IndexOf("\0\0\0")));
var code = data.Remove(0, data.IndexOf("Sec-WebSocket-Key:") + 19);
code = code.Remove(code.IndexOf("==") + 2);
var response = string.Format(@"HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: " + GetServerResponseKey(code));
Console.WriteLine(response);
var encodedResponse = Encoding.UTF8.GetBytes(response);
stream.Write(encodedResponse, 0, encodedResponse.Length);
}
catch (IOException)
{
Console.WriteLine(">> Client Disconnected.");
Console.ReadKey();
return;
}
}
}
private static string GetServerResponseKey(string key)
{
var keyForHash = String.Concat(key, "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");
var encoding = new UTF8Encoding();
var temp = encoding.GetBytes(keyForHash);
var hashProvider = new SHA1CryptoServiceProvider();
var keyForBase64 = hashProvider.ComputeHash(temp);
return Convert.ToBase64String(keyForBase64);
}
そしてクライアントスクリプト:
<script type="text/javascript">
var socket;
function connect()
{
socket = new WebSocket('ws://192.168.0.164:3215');
setTimeout(bindEvents, 1000);
setReadyState();
}
function bindEvents() {
socket.onopen = function() {
alert('handshake successfully established. May send data now...');
setReadyState();
};
socket.onclose = function() {
alert('connection closed');
};
}
function setReadyState() {
console.log('ws.readyState: ' + socket.readyState);
}
connect();
</script>
さらにいくつかの質問:
1-ブラウザが使用しているプロトコルを確認する方法はありますか?
2-Chrome 21が使用するプロトコルはどれですか?