Socket.io 客户端未收到事件

Posted

技术标签:

【中文标题】Socket.io 客户端未收到事件【英文标题】:Socket.io client not receiving events 【发布时间】:2019-02-01 09:33:23 【问题描述】:

当两个客户加入聊天室时,我想向他们每个人发送一条独特的消息。第一个客户端收到消息,但第二个客户端没有。这是代码:

io.on('connection', (socket) => 
var roomName
var firstPlayer
var secondPlayer
var connectedClients

socket.on('roomName', (obj) => 
    roomName = obj.name
    socket.join(roomName)
    connectedClients = Object.keys(io.sockets.adapter.rooms[roomName].sockets)

    if( connectedClients.length > 1 )
        firstPlayer = connectedClients[0]
        secondPlayer = connectedClients[1]
        // sending the icon decision
        socket.to(firstPlayer).emit( 'iconDecide',  iAmX: true  )
        socket.to(secondPlayer).emit( 'iconDecide',  iAmX: false  )
    
)

socket.on('move', (obj) => 
    socket.to(roomName).emit('receiveMove', obj)
) )

我该如何调试呢?如果 socket.io 无法发送消息,有什么方法可以看到错误?

【问题讨论】:

你能解释一下什么是“connectedClients”,它的价值是什么? @AhmedHammad connectedClients 变量保存聊天室中的用户数组。 connectedClients 的示例值为 ['z7NL6BVM7V3dn2TyAAAB', 'o8MmHLVffolZe4fcAAAC']。请注意socket.to(firstPlayer).emit( 'iconDecide', iAmX: true ) 完美执行。但是,socket.to(secondPlayer).emit( 'iconDecide', iAmX: false ) 被解析,但不是由 socket.io 引擎发送。 【参考方案1】:

API doc 中有一条警告,指出它为什么不起作用:

// sending to individual socketid (private message)
io.to(`$socketId`).emit('hey', 'I just met you');
// WARNING: `socket.to(socket.id).emit()` will NOT work, as it will send to 
everyone in the room
// named `socket.id` but the sender. Please use the classic `socket.emit()` 
instead.

您可以使用socket.broadcast 中提到的API doc:

socket.broadcast.to(socketId).emit('msg', 'msg data');

【讨论】:

以上是关于Socket.io 客户端未收到事件的主要内容,如果未能解决你的问题,请参考以下文章

nginx 作为 NodeJS+socket.io 的代理:客户端未收到通知

未处理的 socket.io 事件会发生啥?

事件上的 C++ 侦听器未使用套接字 io C++ 客户端获取事件

Kubernetes 中的 Socket.IO 集群,多个节点未发送给所有客户端

socket.io 客户端未从服务器接收消息

带有django和python socket io的事件