我用这段代码构建了我的 websocket 连接(例如):
var socket = new WebSocket("ws://94.12.176.177:8080");
我关闭了与此的连接:
socket.close();
但是如何重新建立连接?
我做了一些研究并尝试了几种方法。这个问题无法帮助我:Socket.io reconnect on disconnect? 这是唯一接近我正在寻找的结果。
我想这样做的原因是让用户暂时停止向网络发送数据,并在一段时间后重新发送。如果不重新连接,用户必须刷新页面才能重新发送。这可能会导致一些数据丢失。谢谢你。
当服务器关闭连接时,客户端不会尝试重新连接。也许可以使用一些 JS 框架,但在回答这个问题时,问题被标记为普通的 Vanilla JS。
我有点沮丧,因为接受的、被投票的答案显然是错误的,并且在找到正确的解决方案时花费了我一些额外的时间。
我在此页面上找到了一个很好的解决方案:https://sam-low.com/how-to-reopen-a-filled-websocket.html
原始连接关闭后,您需要使用新的事件侦听器创建一个新的 WebSocket 对象
function startWebsocket() {
var ws = new WebSocket('ws://localhost:8080')
ws.onmessage = function(e){
console.log('websocket message event:', e)
}
ws.onclose = function(){
// connection closed, discard old websocket and create a new one in 5s
ws = null
setTimeout(startWebsocket, 5000)
}
}
startWebsocket();
请注意,如果重新连接出现问题,新的 WebSocket 对象仍将收到另一个关闭事件,这意味着即使技术上从未打开过,也会执行
onclose()
。这就是为什么延迟 5 秒是明智的 - 如果没有它,您可能会发现自己以可能会破坏某些东西的速度创建和销毁数千个 Websocket 连接。
注意:该问题被标记为
,因此此答案专门针对socket.io
。socket.io
正如许多人指出的那样,这个答案不适用于普通的 websocket,它在任何情况下都不会尝试重新连接。
Websockets 不会自动尝试重新连接。您必须重新创建套接字才能获得新连接。唯一的问题是您必须重新连接处理程序。
但实际上,Websocket 旨在保持开放。
更好的方法是让服务器关闭连接。这样,websocket 将触发
onclose
事件,但会继续尝试建立连接。当服务器再次监听时,连接将自动重新建立。
完美的实施:
var socket;
const socketMessageListener = (event) => {
console.log(event.data);
};
const socketOpenListener = (event) => {
console.log('Connected');
socket.send('hello');
};
const socketCloseListener = (event) => {
if (socket) {
console.error('Disconnected.');
}
socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open', socketOpenListener);
socket.addEventListener('message', socketMessageListener);
socket.addEventListener('close', socketCloseListener);
};
socketCloseListener();
测试一下:
setTimeout(()=>{
socket.close();
},5000);
编辑:记下指数退避实现(在顶部评论的链接线程中:https://stackoverflow.com/a/37038217/8805423),不在上面的代码中,但非常非常重要。
再次编辑:查看
back
中的primus
:https://www.npmjs.com/package/back,这是一个灵活性感的实现。
function wsConnection(url){
var ws = new WebSocket(url);
var s = (l)=>console.log(l);
ws.onopen = m=>s(" CONNECTED")
ws.onmessage = m=>s(" RECEIVED: "+JSON.parse(m.data))
ws.onerror = e=>s(" ERROR")
ws.onclose = e=>{
s(" CONNECTION CLOSED");
setTimeout((function() {
var ws2 = new WebSocket(ws.url);
ws2.onopen=ws.onopen;
ws2.onmessage = ws.onmessage;
ws2.onclose = ws.onclose;
ws2.onerror = ws.onerror;
ws = ws2
}
).bind(this), 5000)
}
var f = m=>ws.send(JSON.stringify(m)) || "Sent: "+m;
f.ping = ()=>ws.send(JSON.stringify("ping"));
f.close = ()=>ws.close();
return f
}
c=new wsConnection('wss://echo.websocket.org');
setTimeout(()=>c("Hello world...orld...orld..orld...d"),5000);
setTimeout(()=>c.close(),10000);
setTimeout(()=>c("I am still alive!"),20000);
<pre>
This code will create a websocket which will
reconnect automatically after 5 seconds from disconnection.
An automatic disconnection is simulated after 10 seconds.