簡體   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