如何在紧密连接后重新连接到websocket

ket*_*ket 40 javascript html5 websocket socket.io

我使用此代码构建我的websocket连接(例如):

var socket = new WebSocket("ws://94.12.176.177:8080");
Run Code Online (Sandbox Code Playgroud)

我关闭了这个连接:

socket.close();
Run Code Online (Sandbox Code Playgroud)

但是如何重新建立连接?

我做了一些研究并尝试了几种方法.这个问题无法帮助我:断开连接时Socket.io重新连接? 这是唯一接近我正在寻找的结果.

我想这样做的原因是允许用户暂时停止向网络发送数据,并在一段时间后再次重新发送.如果没有重新连接,用户必须刷新页面才能重新发送.这可能会导致一些数据丢失.谢谢.

SzG*_*SzG 67

当服务器关闭连接时,客户端不会尝试重新连接.可能有一些JS框架,但问题是,在这个答案的时候,标记为普通的Vanilla JS.

我有点沮丧,因为接受的,恭维的答案显然是错误的,并且在找到正确的解决方案时花了我一些额外的时间.

这是:当服务器在WebSocket中重新启动时重新连接客户端

  • 对不起你的沮丧.OP链接到`socket.io`问题,这一定是他正在使用的框架.这个问题应该标记为`socket.io`. (4认同)
  • 您指向的答案与@Jivings 的建议基本相同。除了这个没有提到`socket.close`实例方法。 (2认同)

Jiv*_*ngs 13

您必须重新创建套接字才能使其重新连接.唯一的问题是你必须重新连接你的处理程序.

但实际上,websockets旨在保持开放.

更好的方法是让服务器关闭连接.这样websocket将触发​​一个onclose事件,但会继续尝试建立连接.当服务器再次侦听时,将自动重新建立连接.

  • 客户端套接字尝试重新建立连接的行为 - 我猜这是一个socketio的事情?(不是基本的websockets东西?) (11认同)
  • 当服务器关闭连接时,客户端不会尝试重新连接.可能有一些JS框架,但问题被标记为普通的Vanilla JS. (9认同)
  • @UpTheCreek是的,我想是的.如果你调用`close()`,普通的websockets将不会尝试重新连接 (3认同)
  • 普通的香草js不能自动重新连接,这是一个很好的理由.在websocket服务器关闭时,谁想让他的代理服务器受到重创?花点时间实施适合您需求的重新连接策略. (3认同)

小智 5

我在此页面上找到了最佳解决方案: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();
Run Code Online (Sandbox Code Playgroud)

请注意,如果重新连接时出现问题,新的WebSocket对象仍将收到另一个close事件,这意味着onclose()即使它从未在技术上打开过,该事件也将执行。这就是为什么延迟五秒很明智的原因-如果没有延迟,您可能会发现自己创建和破坏了数千个Websocket连接,并且连接速度可能会中断。