繁体   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