socket.io:发送消息到特定的房间(客户端)

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

但是, 客户端 (我的意思是在浏览器中运行的与socket.io相关的代码)如何表示消息应该到达特定的房间?

创build这样的东西是很常见的(当然服务器必须评估它):

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

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

编辑:澄清,我从上面的build议似乎工作,我只是不知道是否有更好的解决scheme。

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

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

但是, 如果您只是希望客户端发送消息到自己的房间 ,则可以让服务器通过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