簡體   English   中英

客戶端等待websocket的最佳方式是什么?

[英]The best way for a client to wait for a websocket?

我想連接到服務器,然后在連接打開后立即執行一些操作。 但是,如果連接停止,我想陷阱,而不是做的東西,也許取消等待連接。

function doStuff () {
    var connection = new WebSocket('wss://someURL');

    //do some stuff here as soon as socket open but trap for stall
}

我正在尋找一些功能,如

connection.addEventListener('timeout',...);

因為在配置我的WS服務器不響應(模擬太慢的服務器)時,Chrome的網絡檢查員會永久地將連接顯示為“待定”。 由於缺乏該功能,我的第一個傳遞是:

function doStuff () {
    var connection = new WebSocket('wss://someURL');
    connection.addEventListener('open', onOpen, false);

    var socketTimer = setTimeout(onNotResponding, 10000);

    function onOpen () {
        clearTimeout(socketTimer);
        //do my stuff here.
    }

    function onNotResponding () { 
        //the server is not responding, how do I "cancel" the connection request here? 
    }
}

(這是一個問題的答案:等待websocket變得可用的最佳方式,我認為這是本帖的目的。無論如何,我在這里留下我的答案,或許其他讀者會發現它有用)。

這是我解決它的方式:

var socket;

var socketOnMessage = function(msg) {
    console.log("received " + msg.data);
};

var socketOnOpen = function(msg) {
    console.log("websocket opened");
};

var socketOnClose = function(msg) {
    console.log('websocket disconnected - waiting for connection');
    websocketWaiter();
};

function websocketWaiter(){
    setTimeout(function(){
        socket = new WebSocket(websocketUrl);
        socket.onopen = socketOnOpen;
        socket.onclose = socketOnClose;
        socket.onmessage = socketOnMessage;
    }, 1000);
};

websocketWaiter();

在onClose事件處理程序中,再次調用websocketWaiter。

在websocketWaiter中,您必須重新初始化事件處理程序,因為您創建了一個新對象。

快速谷歌搜索顯示了這一點。
https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#close%28%29

connection.close();

請注意,您在Chrome開發者工具中看到的待處理連接是初始的http連接,然后保持打開以允許Web套接字進行雙向通信。 你不會看到真正的websocket流量。

為此,您可以在此處安裝免費的WireShark網絡流量嗅探器,查看此解決方案:

如何使用wireshark調試websockets

您還可以使用顯示過濾器過濾以僅顯示WebSocket數據包:(websocket)

暫無
暫無

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

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