【问题标题】:Why are my messages not sending to the Socket.io room with this handler?为什么我的消息没有通过这个处理程序发送到 Socket.io 房间?
【发布时间】:2016-04-04 14:35:05
【问题描述】:

向特定房间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

【问题讨论】:

  • 为了不被房间名M57VUYD1和socket ID57VUYD1的相似性弄糊涂,我解释一下:57VUYD1是我为恰好有的用户定义的ID创建了房间,我用创建者的 ID 命名了房间,除了前面的字母“M”(因为你不能用与一个人相同的 ID 命名房间,因为 Socket.io 向特定用户发送消息的默认方法有效通过让所有用户以他们自己的名字加入一个新房间,然后使用 .to() 方法将消息发送到该房间的语法。)
  • 还要澄清由于变量名称偏好引起的潜在混淆:socket 是我注意到其他人命名为“io”的名称,client 是其他人所说的“套接字”。这就是为什么即使在个人项目中我也应该按照标准格式命名。我现在就进去改一下来解决这个问题,但我不想弄乱当前正在写的任何答案。

标签: javascript socket.io


【解决方案1】:

答案是这样的:更改 Socket.io 中的套接字 ID,正如我在 Stack Overflow 上了解到的,你可以做的事情,但我没有意识到 这样做会在未知的情况下破坏 Socket.io方式。其中一种方法是:房间系统将不再工作。

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

【讨论】:

    【解决方案2】:

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

    尝试发送到客户的地址:

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

    可能是57VUYD1 而不是D4N178C,因为我不确定你是如何定义的。

    我也不确定您分配的哪个变量可以让您获得D4N178C,但您可以将其替换为上面.to() 中有效且应该有效的任何变量。

    【讨论】:

    • 你失去了我。为什么 Socket.io 的房间成员列表中有客户端和服务器?他们都是客户端...服务器是您正在查看的代码。可能我误会你了。。
    • 当客户端建立socket.io连接时,Socket.io给他们一个唯一的ID。您可以将此 ID 更改为您自己选择的唯一 ID。当客户端选择创建会话时,会创建一个带有名称的 socket.io 房间。在我的应用程序中,名称是创建者的套接字 ID,前面带有“M”。我们可以通过观察io.sockets.adapter.rooms 对象来检查房间是否存在。我这样做了,它显示了两个连接的客户端的 ID:那个房间里的 D4N178C 和 57VUYD1。但是在那个房间使用.to() 方法并没有做任何事情。
    • 现在,每个连接到套接字的客户端,默认情况下在 socket.io 中被放置在一个以其唯一 ID 命名的房间中,因此可以像您一样使用.to() 方法向该用户发送消息给房间留言。这是一个房间,只有一个人。因此,如果我按照你说的做,它会根据我指定的 ID 将消息发送到房间中的两个居住者之一,而不是房间中的所有居住者都按需要命名为 .M57VUYD1
    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2019-03-12
    • 2017-09-27
    相关资源
    最近更新 更多