【问题标题】:socket.io: send message to specific room (client side)socket.io:向特定房间发送消息(客户端)
【发布时间】:2015-08-06 18:39:00
【问题描述】:

在socket.io中,如果你想向特定房间发送消息,通常在服务器端使用特定语法:io.to(room).emit('event', 'message');

但是 client(我的意思是在浏览器中运行的与 socket.io 相关的代码)如何指示消息应该发送到特定房间?

只创建这样的东西是否很常见(当然服务器必须对其进行评估):

socket.emit('chat message', {room: 'abc', msg: 'hello there'});

或者 socket.io 客户端库是否也为此目的提供了特定的语法?

编辑:澄清一下,我上面的建议似乎有效,我只是不确定是否有更好的解决方案。

【问题讨论】:

  • AFAIK 房间和命名空间的使用是 socket.io 推荐的socket.io/docs/server-apisocket.io/docs/rooms-and-namespaces
  • 他们建议使用multiplexing, socket.io/docs/#restricting-yourself-to-a-namespace 虽然它是用于namespace 而不是rooms,但在类似情况下可能会有所帮助。
  • @Pogrindis 谢谢,我知道这一点,我确实在服务器端使用了房间的概念。恐怕我的问题还不够清楚。我想知道客户端应用程序(例如,使用 socket.io 的基于 angular.js 的聊天)如何告诉 socket.io 服务器消息应该去哪个房间。
  • @Ankit 谢谢。正如您所指出的,它仅适用于名称空间。不过还是很高兴知道。

标签: javascript node.js socket.io


【解决方案1】:

你已经很清楚了。只有服务器可以发射到特定房间,因为只有服务器实际连接到多个客户端。换句话说,客户端之间没有相互连接——客户端库仅管理该客户端与服务器之间的通信。因此,如果您希望您的客户端应用程序指示服务器向连接到给定房间的所有客户端发出消息……这就是基本的 API 设计。您可以发出套接字事件,或者只是对服务器上的路由进行常规 http 调用。无论哪种方式,您都将发送有关服务器应向哪个房间广播的元数据。然而,前者(发射)可能是首选,因为在服务器端,您可以使用 socket.broadcast.to 向房间中的所有客户端发射,但发起调用的套接字除外(一个非常常见的用例)。

【讨论】:

  • 感谢加布里埃尔的详细回答。所以我没有错。
【解决方案2】:

Alapeno 的解决方案是让客户端将特定房间作为消息数据的一部分发送到服务器,以便服务器知道将消息广播到哪个房间。

但是,如果您只想让客户端向自己的房间发送消息,您可以让服务器通过socket.rooms 对象自行检测客户端的房间。因此,您不需要客户端将其房间名称作为您指示的消息的一部分发送。

Client.js:

socket.emit('chat message', 'hello');

Server.js:

socket.on('chat message', function(msg){
    var keys = Object.keys(socket.rooms);
    for (var i = 0; i < keys.length; i++) {
        io.to(socket.rooms[keys[i]]).emit('chat message', msg);
    }
});

更新:socket.rooms 对象包含一种哈希,如下例所示,因此您最好发送到 socket.rooms 中的所有房间以确保房间成员收到它。无法保证键的顺序。

例子:

socket.rooms[keys[0]] = WMWlX-ekAxa8hP8FAAAE

socket.rooms[keys[1]] = app-chat-room

【讨论】:

  • 如果我从外面来并且我有房间钥匙怎么办,我怎么能把它发送到 orden socket.io 知道我想加入什么房间钥匙?
猜你喜欢
  • 1970-01-01
  • 2012-05-24
  • 1970-01-01
  • 2011-06-06
  • 2023-03-27
  • 2011-10-18
  • 1970-01-01
  • 2019-03-12
  • 2017-09-27
相关资源
最近更新 更多