簡體   English   中英

如何更改打開WebSocket的超時?

[英]How do I change the timeout for an opening a WebSocket?

簡短而有趣:嘗試過一段時間后,如何告訴WebSocket停止或“關閉”?

我目前正在開發類似Kahoot的網絡應用程序,玩家可以在其中連接手機。 該游戲使用完全原始的JavaScript在后台運行所有內容,並使用WebSockets與django-channels游戲服務器進行通信。 除玩家意外鎖定手機或切換應用程序並關閉其WebSocket的情況外,游戲都可以正常運行。 我可以輕松地打開一個新的連接,但是由於某種原因,在移動瀏覽器中,WebSocket會永遠放棄連接。

例如:

  1. 用戶在Wifi上連接並打開WebSocket
  2. 用戶斷開與Wifi的連接,並丟棄WebSocket而不調用.close並正確關閉連接
  3. 用戶嘗試在沒有Wifi的情況下打開新的WebSocket
  4. 然后,用戶連接到Wifi,而以前的WebSocket仍在嘗試連接

在我的測試中,第二個WebSocket將嘗試連接至少一分鍾,直到最終讓步並失敗。 只有這樣,我才能嘗試重新連接,並誇大了重新連接播放器的整個過程。

因此,就像我在上面問過的:如何縮短此過程? 有沒有辦法讓WebSocket早點放棄,還是我做錯了呢?

如果我需要添加更多信息,請告訴我。 這是我第一次發貼。

非常感謝!

我沒有在webSocket API規范的任何地方看到連接超時,也沒有在任何webSocket文檔中找到任何提及。 因此,看來您可能必須實現自己的。 這是一種方法:

function connectWebSocket(url, timeout) {
    timeout = timeout || 2000;
    return new Promise(function(resolve, reject) {
        // Create WebSocket connection.
        const socket = new WebSocket(url);

        const timer = setTimeout(function() {
            reject(new Error("webSocket timeout"));
            done();
            socket.close();
        }, timeout);

        function done() {
            // cleanup all state here
            clearTimeout(timer);
            socket.removeEventListener('error', error);
        }

        function error(e) {
            reject(e);
            done();
        }

        socket.addEventListener('open', function() {
            resolve(socket);
            done();
        });
        socket.addEventListener('error', error);
    });
}

// Usage    
connectWebSocket(yourURL, 1000).then(function(socket) {
    socket.send("hello");
    // put other code that uses webSocket here
}).catch(function(err) {
    console.log(err);
});

暫無
暫無

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

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