Socket.IO 订阅多个频道

Posted

技术标签:

【中文标题】Socket.IO 订阅多个频道【英文标题】:Socket.IO subscribe to multiple channels 【发布时间】:2013-05-01 15:34:33 【问题描述】:

我想在 Socket.IO 之上构建一个简单的聊天室系统,用户可以在其中创建一个新的聊天室,然后人们就可以开始聊天了。

这听起来很简单,但是作为我现在正在运行的 Socket.IO 0.9.4,在阅读了一些 SO 帖子以及关于 socket.io 的文档之后,我越来越困惑。所以,我希望有人可以为我提供适用于 0.9.4 的说明:

    我需要一种订阅房间的方法。房间名称由用户选择。当消息发布在房间中时,用户应该会收到它。服务端代码怎么写,客户端代码怎么写?

    一个用户可以同时加入多个房间。

    我希望另一个系统向某个房间中的所有用户发送消息。这个“另一个系统”通过 express 处理的请求发送消息。我将如何编写该请求处理程序?

【问题讨论】:

这个问题你解决了吗?如果是这样,你能指出我的源代码吗?谢谢 【参考方案1】:

使用 socket.io 房间功能,这一切都非常简单。查看 LearnBoost wiki 上的文档。

https://github.com/LearnBoost/socket.io/wiki/Rooms

它允许通过一个插座连接到多个房间。我用下面的代码做了一个快速测试。

服务器

io.sockets.on('connection', function(client)
    client.on('subscribe', function(room)  
        console.log('joining room', room);
        client.join(room); 
    )
    
    client.on('unsubscribe', function(room)   
        console.log('leaving room', room);
        client.leave(room); 
    )

    client.on('send', function(data) 
        console.log('sending message');
        io.sockets.in(data.room).emit('message', data);
    );
);

客户

 var socket = io.connect();
 socket.on('message', function (data) 
  console.log(data);
 );
 
 socket.emit('subscribe', 'roomOne');
 socket.emit('subscribe', 'roomTwo');
 
 $('#send').click(function() 
  var room = $('#room').val(),
   message = $('#message').val();
   
  socket.emit('send',  room: room, message: message );
 );

从 Express 路由发送消息也非常简单。

app.post('/send/:room/', function(req, res) 
    var room = req.params.room
        message = req.body;

    io.sockets.in(room).emit('message',  room: room, message: message );

    res.end('message sent');
);

【讨论】:

有没有办法让客户离开已加入的两个房间中的任何一个?? 我不确定。您可以将 2 个房间存储在一个数组中,然后执行循环并取消订阅。或者可能有断开功能。 (我没用过) @kbariotis 完全。创建一个类似"leave" 的消息,并让您的客户发送它,并附上他希望离开的房间的名称。然后连接“断开连接”按钮以发送此类消息。服务器端,命令套接字离开给定的房间。 @Timothy Strimple 你不应该也听 socket.on 'disconnect',所以如果断开连接,用户会自动取消订阅房间,或者 socket.io 会为我们处理这种情况吗? 根据socket.io文档(socket.io/docs/rooms-and-namespaces):Upon disconnection, sockets leave all the channels they were part of automatically, and no specially teardown is needed on your part.

以上是关于Socket.IO 订阅多个频道的主要内容,如果未能解决你的问题,请参考以下文章

如何停止收听 socket.io 频道?

Pubnub Socket.io - 与频道断开连接

使用 socket.io 和 Laravel Echo 时如何保护私有频道?

Laravel 使用 Socket.io 广播到私人频道

无法使用 Laravel echo server、redis 和 socket.io 验证 laravel 私人频道

GraphQL 订阅与 socket.io