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

ala*_*eno 26 javascript node.js socket.io

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

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

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

socket.emit('chat message', {room: 'abc', msg: 'hello there'});
Run Code Online (Sandbox Code Playgroud)

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

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

Gab*_* L. 22

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


Sam*_*Sam 5

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

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

客户端.js:

socket.emit('chat message', 'hello');
Run Code Online (Sandbox Code Playgroud)

服务器.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);
    }
});
Run Code Online (Sandbox Code Playgroud)

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

例子:

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

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