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

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

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

例如:

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

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

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

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

非常感谢!

【问题讨论】:

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

标签: javascript ios websocket mobile-safari django-channels


【解决方案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 对象。您必须像我展示的那样使用该承诺来从中获取套接字。
猜你喜欢
  • 1970-01-01
  • 2019-12-22
  • 2023-03-05
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多