繁体   English   中英

WebSocket连接正在关闭

[英]WebSocket connection is closing

我是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>

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

在任何规范下,这都不是有效的网络套接字响应。 最初的网络套接字响应始终要求您将一些数字作为响应标头的一部分,以证明您是网络套接字服务器。 读取和写入的标头以及要执行的操作取决于Web套接字的版本(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节)。

javascript代码连接到Web服务器之后。 C#运行所有using语句,并将所有行打印到文件中,然后关闭所有using语句,从而处理生成的客户端,从而关闭连接。
解决此问题的快速方法(但较脏)是在using语句的末尾添加“ Console.Readline”。 不过要小心,您的过程将挂起!
有关TcpClients接受客户端的更多信息,请转到msdn
请注意,此处给出的示例一次只允许一个连接。
最后一句话:存在像Marc建议的用于接受WebSocket连接的库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM