【问题标题】:socket.io creates one more connection after reconnectingsocket.io 重新连接后再创建一个连接
【发布时间】:2013-05-28 09:03:06
【问题描述】:

我正在使用 socket.io 和 node.js 尝试一个简单的聊天应用程序here。每次我重新启动 node.js 服务器时,socket.io 都会自动重新连接,并以某种方式再创建一个与服务器的连接,即客户端现在会收到两次相同的聊天消息。我该如何解决这个问题?

【问题讨论】:

  • 您的链接已过期,请在此处分享您的代码。编辑您的问题以了解我们。其实我是来找答案的,但是在不知道这个问题的情况下,我该如何应用答案。 :)

标签: node.js socket.io


【解决方案1】:

默认情况下,断开连接时 socket.io 会重新连接丢失的连接,这会重新运行 connect 事件。因此,每次重新连接时,您都会再添加一个事件侦听器来接收消息。因此,您会收到多条消息,等于服务器重新启动/连接丢失。

Incoming Chat: 
Connected
dsdadsada
Disconnected                         //recieved by 1st listener
Connected                            //added 2nd listener
adasd
Disconnected                         //recieved by 1st listener
Disconnected                         //recieved by 2nd listener
Connected                            //added 3rd listener

您应该使用once 而不是on 来监听第一个连接,它只在第一次运行事件处理程序。试试

iosocket.once('connect', function () {

而不是

iosocket.on('connect', function () {

【讨论】:

  • 理想情况下,您不应该在连接上添加事件侦听器(或任何其他应用程序功能)。
  • 在服务器端,这可以使用命名空间来解决。这让您也可以将once 用于服务器上客户端的connect 事件。遗憾的是,我们没有直接用于服务器的onceio.once('connect', (socket: SocketIO.Socket) => { }) 在 TS 中出现编译错误,而 io.of('/xyz').once('connect', (socket: SocketIO.Socket) => { }) 运行良好。
  • @Shamps 你能解释一下为什么这不是一个好的做法吗?
  • @igortp 如果您在应用程序初始化时使用“on”方法注册事件处理程序,则无需在每个连接上都这样做。当 websocket 重新连接并接收到新消息时,将触发回调。如果您在每个连接上添加事件处理程序,那么您还需要在断开连接时管理删除,这是不必要的。遗留的处理程序可能导致内存泄漏
【解决方案2】:

尝试用这种方式编写 index.html

 iosocket.on('connect', function () {
      $('#incomingChatMessages').append($('<li>Connected</li>'));
 });

 iosocket.on('message', function(message) {
      $('#incomingChatMessages').append($('<li></li>').text(message));
 });

 iosocket.on('disconnect', function() {
      $('#incomingChatMessages').append('<li>Disconnected</li>');
 });

可能是其他 2 个事件监听器注册到了连接事件。 当客户端断开连接时,其他 2 个侦听器仍会在这里并且不会取消注册。

【讨论】:

  • 我认为您的解决方案更好。这里重要的是,在客户端脚本中,您将其他事件与“连接”事件分开。 (写在连接事件之外)
猜你喜欢
  • 2021-06-28
  • 2016-03-28
  • 1970-01-01
  • 2016-11-02
  • 2011-11-22
  • 1970-01-01
  • 2013-11-21
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多