如何更改打开 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 连接到“wss://test.example.com:8090/”失败:WebSocket 打开握手超时
FastAPI websocket ping/pong 超时