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

时间:2016-04-04 14:35:06

标签: javascript socket.io

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

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

2 个答案:

答案 0 :(得分:4)

答案是这样的:改变Socket.io中的套接字ID,就像我在Stack Overflow上学到的那样,你可以做的事情,但我没有意识到的是这样做会破坏未知的Socket.io方式即可。其中一种方法是:房间系统将不再有效。

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

答案 1 :(得分:0)

根据你所说的,包括所有的重命名(这使得它更难猜),你似乎有2个连接:57VUYD1似乎是服务器,{{1}我猜的是客户端。因此,尝试连接D4N178C不会有太大作用。

尝试发送到客户端的地址:

M57VUYD1

可能是socket.to('D4N178C').emit('receive message', { name : data.name, message : data.message, sender : client.id }); 而不是57VUYD1,因为我不确定你是如何定义的。

我也不确定您分配的哪个变量会让您获得D4N178C,但您可以将其替换为上述D4N178C中的任何作品并且应该有效。