繁体   English   中英

为什么我的消息没有与此处理程序一起发送到Socket.io房间?

[英]Why are my messages not sending to the Socket.io room with this handler?

根据文档将消息发送到Socket.io中特定房间的方式似乎很简单。 在下面的代码中是一个处理程序,它是更大模块的一部分,但是功能应该都非常简单,特别是因为我正在显示暴露每个变量代表什么的日志:

module.exports.handle = function(client, data, socket, sessions, callback) {
    debug.log('Client, ' + data.name + ' sent message:' + data.message);
    debug.log(JSON.stringify(data, null, 3));
    var sessionId = data.code;
    var name = data.name;
    var room = JSON.stringify(socket.sockets.adapter.rooms[sessionId]);
    debug.log('Socket.io Room: ' + room);
    socket.to(sessionId).emit('receive message', {
        name : data.name,
        message : data.message,
        sender : client.id
    });
};

在以下日志中(基于前面的代码),它似乎清楚地表明了我指定的房间是有效的Socket.io房间,因此我不明白为什么(在这种情况下) .to('M57VUYD1')无法发送消息到房间。 在这种情况下,日志似乎可以确认M57VUYD1是有效房间。

[Debug][Send Message Event Handler]: Client, Jonathan sent message:hey
[Debug][Send Message Event Handler]: {
   "message": "hey",
   "name": "Jonathan",
   "code": "M57VUYD1"
}
[Debug][Send Message Event Handler]: Socket.io Room: {"sockets":{"57VUYD1":true,"D4N178C":true},"length":2}

该模块无法正常工作是否有问题? 还是我使用了正确的语法?

我正在全局发送这些消息(非基于房间),并且客户端正在完美地接收消息 ,因此我认为客户端套接字事件侦听器没有问题。 它似乎不是我加入会议室的模块,因为日志显示两个客户端是会议室的成员,因为它们应该在Socket.io的会议室数据结构中。

我在GitHub上更详细地添加了此问题: https : //github.com/socketio/socket.io/issues/2518

答案是这样的:正如我在Stack Overflow上了解到的那样,更改Socket.io中的套接字ID是您可以做的,但是我没有意识到的是, 这样做会以未知的方式破坏Socket.io 这些方法之一是:房间系统将不再起作用。

换句话说,不要将套接字ID更改为您自己选择的套接字,库不支持这样做。

根据您所说的内容,包括所有重命名(这使您更难猜测),您似乎有2个连接: 57VUYD1 (似乎是服务器)和D4N178C (我猜是客户端)。 因此,尝试连接到M57VUYD1不会做太多事情。

尝试发送到客户的地址:

socket.to('D4N178C').emit('receive message', {
    name : data.name,
    message : data.message,
    sender : client.id
});

可能是57VUYD1而不是D4N178C ,因为我不确定您如何定义事物。

我也不确定您分配的变量将使您获得D4N178C ,但您可以将其替换为上面D4N178C .to()可以正常工作的任何变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM