繁体   English   中英

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

[英]socket.io: send message to specific room (client side)

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

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

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

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

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

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

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

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

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

客户端.js:

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

服务器.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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM