Socket.IO订阅多个频道

Phư*_*yễn 41 socket.io

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

这听起来很简单但是作为Socket.IO 0.9.4我现在正在运行,在阅读了一些SO帖子和socket.io上的文件后,我变得越来越困惑.所以,我希望有人能为我提供与0.9.4一起工作的指导:

  1. 我需要一种订阅房间的方法.房间名称由用户选择.当消息在房间中发布时,用户应该接收消息.我该如何编写服务器代码,我该如何编写客户端代码?

  2. 用户可以同时加入多个房间.

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

Tim*_*ple 105

socket.io房间功能非常简单.看看LearnBoost wiki上的文档.

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

它允许通过单个插座连接到多个房间.我用以下代码组装了一个快速测试.

服务器

io.sockets.on('connection', function(socket){
    socket.on('subscribe', function(room) { 
        console.log('joining room', room);
        socket.join(room); 
    })

    socket.on('unsubscribe', function(room) {  
        console.log('leaving room', room);
        socket.leave(room); 
    })

    socket.on('send', function(data) {
        console.log('sending message');
        io.sockets.in(data.room).emit('message', data);
    });
});
Run Code Online (Sandbox Code Playgroud)

客户

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

从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');
});
Run Code Online (Sandbox Code Playgroud)

  • @Timothy Strimple你也不应该听socket.on'disconnect',所以如果断开连接或者socket.io会为我们处理这种情况,用户会自动取消订阅房间吗? (3认同)
  • 根据socket.io文档(https://socket.io/docs/rooms-and-namespaces/):`断开连接后,套接字会自动离开它们所属的所有通道,不需要您进行专门的拆卸。 ` (2认同)