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 的代理:客户端未收到通知
事件上的 C++ 侦听器未使用套接字 io C++ 客户端获取事件