如何更改打开 WebSocket 的超时时间?

Posted

技术标签:

【中文标题】如何更改打开 WebSocket 的超时时间?【英文标题】:How do I change the timeout for an opening a WebSocket? 【发布时间】:2018-07-25 19:54:06 【问题描述】:

短而甜: 在尝试打开一段时间后如何告诉 WebSocket 停止或“关闭”?

我目前正在开发一款类似于 Kahoot 的网络应用程序,玩家可以在其中连接手机进行游戏。该游戏使用完全原生的 javascript 在后台运行所有内容,并使用 WebSockets 与 django-channels 游戏服务器进行通信。除了玩家不小心锁定手机或切换应用程序并关闭 WebSocket 的情况外,游戏运行良好。我可以轻松地打开一个新连接,但由于某种原因,在移动 Safari 中,WebSockets 需要永远放弃连接。

例如:

    用户通过 Wifi 连接并打开 WebSocket 用户在没有调用.close 和正确关闭连接的情况下断开 Wifi 并丢弃 WebSocket 用户尝试在没有 Wifi 的情况下打开新的 WebSocket 用户在之前的 WebSocket 仍在尝试连接时连接到 Wifi

在我的测试中,第二个 WebSocket 将尝试连接至少一分钟,然后最终屈服并失败。只有这样我才能再次尝试重新连接,只是夸大了重新连接播放器的整个过程。

就像我上面问的那样:我怎样才能缩短这个过程?有没有办法让 WebSocket 早点放弃,还是我做错了?

如果我需要添加更多信息,请告诉我。这是我第一次发帖。

非常感谢!

【问题讨论】:

你读过this SO question吗? 什么是客户端开发环境?在那里您可以检查您的 webSocket 接口以查看它提供的超时或重试值。它只是一个浏览器吗?还是别的什么? @jfriend00 这只是两个浏览器:android 上的 Chrome 和 ios 上的 Safari。我一直在寻找超时和重试值,但没有找到太多。如果有人能指出我正确的方向,那就太棒了。 【参考方案1】:

我在webSocket API specification 的任何地方都没有看到连接超时,在任何 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);
);

【讨论】:

使用您的代码非常适合建立 WebSocket,但是在该函数返回的对象上调用 websocket.send 时,我得到了 websocket.send is not a function。我错过了什么吗? @kawub - 因为在我推荐的名为websocket 的代码中没有任何变量,所以我不知道你在做什么。与往常一样,我只能提供我能看到的代码。您可以将尝试的代码添加到问题的末尾,以便我看到。此函数返回一个承诺,而不是 webSocket 对象。您必须像我展示的那样使用该承诺来从中获取套接字。

以上是关于如何更改打开 WebSocket 的超时时间?的主要内容,如果未能解决你的问题,请参考以下文章

Websocket 连接立即打开和关闭

WebSocket 连接到“wss://test.example.com:8090/”失败:WebSocket 打开握手超时

Qt/OSX WebSocket 打开握手超时

FastAPI websocket ping/pong 超时

带有 ALB 的 AWS Elastic Beanstalk:节点 Websocket 超时

Python Tornado Websocket连接在关闭后仍然打开