簡體   English   中英

JS Websocket 卡在狀態 CONNECTING to TCPListener - VB.net

[英]JS Websocket stuck in state CONNECTING to TCPListener - VB.net

注意:我發現的最接近我的問題是this one ,但答案是通過代理函數發送數據,該函數等待 readyState 為 1。盡管標題非常相似,但這不是該問題的重復; 我知道我的問題在於我的服務器沒有將數據傳回客戶端,但我不知道要傳遞什么。

細節:

我在我的服務器程序中定義了一個 TCP 偵聽器作為New TcpListener(ipAd, 8001)並且我編寫了一個客戶端程序作為New TcpClient()來連接到服務器。 這些程序按預期工作,一旦建立連接,客戶端就准備好向服務器發送數據。

在我完成客戶端和服務器之后,我開始開發一個 Web 界面來充當客戶端,這樣我就可以從任何設備向套接字發送數據。 這是 websocket 的 javascript 代碼:

    console.log("Attempting to connect...");

    ws = new WebSocket('ws://192.168.0.10:8001/');

    ws.onopen = function(msg) {
        console.log('Connection successfully opened');
    };

    ws.onmessage = function(msg) {
        console.log(msg);
    };

    ws.onclose = function(msg) {
        console.log("Closed.");
    }

    ws.error = function(err){
        console.log(err);
    }

當我加載網頁時,我在服務器控制台應用程序中看到已建立連接。 這是輸出:

GET / HTTP/1.1
Host: 192.168.0.10:8001
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-
cache
Upgrade: websocket
Origin: null
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows
 NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.99 Safari/537.36
Accept-Enc
oding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
Sec-WebSocket-Key: key_here
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

如此清楚地發送和接收 HTTP 標頭; 但是,我的服務器(當前)沒有將任何內容發送回客戶端,因此當我嘗試發出ws.send("test"); 從 websocket,我在控制台中收到一個錯誤:

Uncaught InvalidStateError: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.

我的問題:我需要從我的服務器向客戶端發送什么來完成握手,以便我可以使用ws.send();發送數據ws.send(); ?

您需要實現 webSocket 的服務器端(或使用為您執行此操作的 webSocket 庫)。 這是VB 中一個示例實現 以及帶有示例代碼的類似問題

webSocket 連接的工作方式如下:

  1. 客戶端使用自定義標頭向服務器發出 http 請求,請求升級到 webSocket 協議

  2. 服務器響應升級到 webSocket 沒問題,並使用隨機生成的安全密鑰。

  3. 服務端發送響應,客戶端收到后,雙方切換到webSocket數據幀格式,以備后續數據使用。

  4. 此外,還有一些必須支持的強制消息,例如 ping 和 pong,以支持客戶端將使用的keepalive 心跳來了解連接是否還活着。

有關示例響應和 webSocket 數據幀格式的描述,請參閱本文

此外,瀏覽器默認強制執行同源限制,因此如果您嘗試從瀏覽器連接到與 Javascript 所在網頁不同的源,那么您將需要來自服務器的適當 CORS 標頭以啟用交叉原點連接。


這是一個示例連接:

客戶端發送這個:

GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13

服務器響應如下:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

然后,數據框如下所示:

0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
|                               |Masking-key, if MASK set to 1  |
+-------------------------------+-------------------------------+
| Masking-key (continued)       |          Payload Data         |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                     Payload Data continued ...                |
+---------------------------------------------------------------+

當然,webSocket RFC 官方規范在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM