【问题标题】:Socket.io server dropping connectionsSocket.io 服务器断开连接
【发布时间】:2021-06-30 15:30:46
【问题描述】:

我正在开发一个聊天应用程序(使用 NodeJS + Socket.IO)。

在我的服务器中,我有一个名为 users 的数组变量,用于存储所有在线用户。

当用户登录时,一个包含所有用户信息的对象被推送到 users 数组中,当它退出时,会发出一个 'user_logout' 事件:

var users = []; //array of online users

io.on('connect', (socket) => {
  socket.on('user_login',(user)=>{
  //USER LOGS IN
    users.push(user)
  })
  socket.on('disconnect',()=>{
    //USER LOGS OUT
    var message = socket.id + "logs out"; // ERROR: socket is undefined
    io.emit('user_logout',message)
  })
})

从我上面的 sn-p 可以看出,socket 对象似乎是未定义的,导致我的应用程序崩溃。

只有当用户有一段时间不活动(比如说几分钟)时才会抛出错误,否则它可以正常工作!

似乎socket在没有警告的情况下破坏了空闲连接,导致对象socket为空

【问题讨论】:

  • socket.emit 将发送到当前正在断开连接的套接字,您需要 socket.broadcast.emit 代替,另外您不要从用户数组中删除断开连接的用户
  • 要清楚,当socket 断开连接时,您想向那个 same 套接字发送一条新消息,但它不会收到它,因为它已断开连接?一种解决方法是简单地存储id,这样您就不需要通过socket 对象
  • 我不小心写了 socket.emit 而不是 io.emit。无论如何问题总是一样的,socket是一个未定义的对象
  • 我从来没有遇到过这种情况。但是尝试使用this 而不是socket

标签: javascript sockets socket.io


【解决方案1】:

我不确定socketdisconnect 上的undefined 是一个错误 - 套接字不再连接,因此不再存在。我想这将取决于 socket.io 何时正式取消引用。

我在文档 (https://socket.io/docs/v3/server-api/index.html#Event-%E2%80%98disconnect%E2%80%99) 中找不到太多内容,但我怀疑这是服务器手动调用 disconnect() 与套接字因连接断开或类似情况而断开连接之间的区别。

要么单独存储id,或者您可以尝试使用disconnecting 回调:

当客户端将要断开连接(但尚未离开其房间)时触发。

【讨论】:

    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2017-11-05
    相关资源
    最近更新 更多