0

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が使用するプロトコルはどれですか?

4

1 に答える 1

1

応答は、HTTP要求/応答のルールに従い、各ヘッダーと最後のペアの間にキャリッジリターン+ラインフィードを含める必要があります。応答で新しい行を使用する代わりに、それらをエスケープエンコードします。

"header1 \ r \ nheader2 \ r \ nheader3 \ r \ n \ r \ n"

「Sec-WebSocket-Version:13」ヘッダーは、ブラウザーがIETF6455であるプロトコルのバージョン13を使用していることを示します。

于 2012-09-13T18:33:40.573 に答える