我建立这个代码(例如)我的WebSocket连接:
var socket = new WebSocket("ws://94.12.176.177:8080");
我关闭这一个连接:
socket.close();
但我怎么重新建立连接?
我做了一些研究,尝试了几种方法。 这个问题不能帮我: Socket.io重新连接上断开? 这其中接近我正在寻找的唯一结果。
我想这样做的原因是为了让用户停止发送数据到网络暂时的,并在一段时间后再次重新发送。 如果没有重新连接,用户需要刷新页面,以便重新发送。 这可能会导致失去了一些数据。 谢谢。
你必须重新插座为了得到它重新连接。 与唯一的问题是,你必须重新安装你的处理程序。
不过说真的,WebSockets的设计保持开放。
更好的方法是在服务器关闭连接 。 这样WebSocket的必火的onclose
事件,但将继续尝试进行连接。 当服务器监听再次连接将被自动重新建立。
当服务器关闭连接,客户端不会尝试重新连接。 随着一些JS框架也许,但问题是,在这个答案的时候,标记为纯香草JS。
我有点失望,因为接受,upvoted答案显然是错误的,我同时找到正确的解决方案它的成本一些额外的时间。
这是在这里: 客户端重新连接时,服务器重新启动的WebSocket
完美无瑕的实现:
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 ,它是一种灵活的性感的实现。
我发现这个页面上的最佳解决方案:sam-low.com
一旦原来的连接已关闭,您需要创建新的事件监听器一个新的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()
会,即使它从来没有在技术上打开执行。 这就是为什么五秒钟的延迟是明智的 - 没有它,你会发现自己创造,并在此可能会碰坏的速度摧毁数以千计的WebSocket连接。