0

我是 WebSocket API 的初学者。我正在尝试在本地连接到我的服务器,但我正在获取连接关闭消息。谁能告诉我我做错了什么?

那是我的代码:

服务器

using System.Net.Sockets;
using System.Net;
using System.IO;
using System;
class Program
{
    static void Main(string[] args)
    {
        var listener = new TcpListener(IPAddress.Loopback, 8181);
    listener.Start();
    while (true)
    {
        Console.WriteLine("Listening...");
        using (var client = listener.AcceptTcpClient())
        using (var stream = client.GetStream())
        using (var reader = new StreamReader(stream))
        using (var writer = new StreamWriter(stream))
        {

            string line = null, key = "", responseKey = "";
            string MAGIC_STRING = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
            while (line != "")
            {
                line = reader.ReadLine();
                if (line.StartsWith("Sec-WebSocket-Key:"))
                {
                    key = line.Split(':')[1].Trim();
                }
            }

            if (key != "")
            {
                key += MAGIC_STRING;
                using (var sha1 = SHA1.Create())
                {
                    responseKey = Convert.ToBase64String(sha1.ComputeHash(Encoding.ASCII.GetBytes(key)));
                }
            }

            // send handshake to the client
            writer.WriteLine("HTTP/1.1 101 Web Socket Protocol Handshake");
            writer.WriteLine("Upgrade: WebSocket");
            writer.WriteLine("Connection: Upgrade");
            writer.WriteLine("WebSocket-Origin: http://localhost:8080");
            writer.WriteLine("WebSocket-Location: ws://localhost:8181/websession");
            if (!String.IsNullOrEmpty(responseKey))
                writer.WriteLine("Sec-WebSocket-Accept: " + responseKey);
            writer.WriteLine("");
            Console.ReadLine();
            writer.Flush();

        }//using
        Console.WriteLine("Finished");
    }//while

    }
}

客户端

     <!DOCTYPE HTML>
       <html>
       <head><title></title>
          <script type="text/javascript">

       function WebSocketTest() {
          var msg = document.getElementById("msg");
            if ("WebSocket" in window) {
             msg.innerHTML="WebSocket is supported by your Browser!";
        // Let us open a web socket
        var ws = new WebSocket("ws://localhost:8181/websession");
        ws.onopen = function () {
            // Web Socket is connected, send data using send()
             msg.innerHTML="connection open";
            //ws.send("Message to send");
            //msg.innerHTML="Message is sent...";
        };
        ws.onclose = function () {
            // websocket is closed.
            msg.innerHTML = "Connection is closed...";
        };

        ws.onerror = function(error){
            console.log('Error detected: ' + error);
        };
        ws.onmessage = function (evt) {
            var received_msg = evt.data;
            msg.innerHTML="Message is received...";
        };

    }
    else {
        // The browser doesn't support WebSocket
        msg.innerHTML="WebSocket NOT supported by your Browser!";
    }
   }
   </script>
     </head>
       <body>
       <div id="sse">
        <a href="javascript:WebSocketTest()">Run WebSocket</a><br />
         <p id="msg"></p>
       </div>
        </body> 
           </html>

任何解决方案将不胜感激,谢谢:)

4

2 回答 2

0

在任何规范下,这都不是有效的 web-socket 响应。初始的 web-socket 响应总是要求你处理一些数字作为响应头的一部分,以证明你是一个 web-socket 服务器。要读取和写入哪些标头,以及要执行什么操作,取决于 web-sockets 的版本(hibi/hixie 76/rfc)。实际上,您的服务器似乎正在使用客户端的标头。

例如,RFC6455 (13) 响应将开始:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: {crunch some numbers}

请注意,Hixie-76 响应是不同的,上面有一些我省略了。

来自RFC6455 规范

为了证明握手被接收,服务器必须获取两条信息并将它们组合起来形成响应。第一条信息来自|Sec-WebSocket-Key| 客户端握手中的头字段:

 Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

对于这个头域,服务器必须取值(在头域中,例如,base64 编码的 [RFC4648] 版本减去任何前导和尾随空格)并将其与全局唯一标识符(GUID,[RFC4122 ]) 字符串形式的“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,不太可能被不理解 WebSocket 协议的网络端点使用。然后在服务器的握手中返回此连接的 SHA-1 哈希(160 位)[FIPS.180-3],base64 编码(参见 [RFC4648] 的第 4 节)。

于 2013-01-31T10:51:16.667 回答
0

在 javascript 代码连接到网络服务器之后。C# 运行所有 using 语句并将所有行打印到文件中,然后关闭所有 using 语句,从而释放生成的客户端,从而关闭连接。
一个快速(但肮脏)的解决方法是在 using 语句的末尾添加“Console.Readline”。不过要小心,你的进程会挂起!
有关 TcpClients 接受客户端的更多信息,请访问msdn
请注意,那里的给定示例一次只允许一个连接。
最后一句话:存在像 Marc 建议的接受 websocket 连接的库。

于 2013-01-31T11:41:33.400 回答