在socket.io中,如果要向特定房间发送消息,通常在服务器端使用特定语法:io.to(room).emit('event', 'message');
。
但是客户端(我的意思是在浏览器中运行的socket.io相关代码)如何表明消息应该转到特定的房间?
通常只创建这样的东西(当然服务器必须对其进行评估):
socket.emit('chat message', {room: 'abc', msg: 'hello there'});
或者socket.io客户端库是否也为此提供了特定的语法?
编辑:澄清一下,我上面的建议似乎有效,我只是不确定是否有更好的解决方案。
答案 0 :(得分:20)
你已经弄明白了。只有服务器可以向特定房间发射,因为它只是实际连接到多个客户端的服务器。换句话说,客户端没有相互连接 - 客户端库只管理该客户端和服务器之间的通信。因此,如果您希望您的客户端应用程序指示服务器向连接到给定房间的所有客户端发送消息...这是基本的API设计。您可以发出套接字事件,或只是对服务器上的路由进行常规http调用。无论哪种方式,您都将发送有关服务器应广播到哪个房间的元数据。然而,前者(发射)可能是首选,因为在服务器端,您可以使用socket.broadcast.to
向房间中的所有客户端发出除了发起调用的套接字(一个非常常见的用例)。
答案 1 :(得分: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