如何重新连接紧密结合后的WebSocket(How to reconnect to websocke

2019-07-04 20:14发布

我建立这个代码(例如)我的WebSocket连接:

var socket = new WebSocket("ws://94.12.176.177:8080");

我关闭这一个连接:

socket.close();

但我怎么重新建立连接?

我做了一些研究,尝试了几种方法。 这个问题不能帮我: Socket.io重新连接上断开? 这其中接近我正在寻找的唯一结果。

我想这样做的原因是为了让用户停止发送数据到网络暂时的,并在一段时间后再次重新发送。 如果没有重新连接,用户需要刷新页面,以便重新发送。 这可能会导致失去了一些数据。 谢谢。

Answer 1:

你必须重新插座为了得到它重新连接。 与唯一的问题是,你必须重新安装你的处理程序。

不过说真的,WebSockets的设计保持开放。

更好的方法是在服务器关闭连接 。 这样WebSocket的必火的onclose事件,但将继续尝试进行连接。 当服务器监听再次连接将被自动重新建立。



Answer 2:

当服务器关闭连接,客户端不会尝试重新连接。 随着一些JS框架也许,但问题是,在这个答案的时候,标记为纯香草JS。

我有点失望,因为接受,upvoted答案显然是错误的,我同时找到正确的解决方案它的成本一些额外的时间。

这是在这里: 客户端重新连接时,服务器重新启动的WebSocket



Answer 3:

完美无瑕的实现:

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 ),而不是在上面的代码,但非常非常关键的。

再次编辑:退房backprimus : https://www.npmjs.com/package/back ,它是一种灵活的性感的实现。



Answer 4:

我发现这个页面上的最佳解决方案: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连接。



文章来源: How to reconnect to websocket after close connection