2013-05-07 123 views
30

我想在Socket.IO之上建立一个简单的聊天室系统,用户可以创建一个新的聊天室,然后人们可以开始聊天。Socket.IO订阅多个频道

这听起来很简单,但是现在我正在运行Socket.IO 0.9.4,在阅读了几篇SO帖子以及socket.io上的文档后,我越来越困惑。所以,我希望有人能够给我提供0.9.4版的指令:

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

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

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

+0

你解决了这个问题吗?如果是的话,你可以指向我的源代码?谢谢 – sinusGob 2017-05-01 20:55:19

回答

88

这是所有相当与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); 
    }); 
}); 

客户

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 }); 
}); 

从快速通道发送消息是很简单的为好。

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'); 
}); 
+0

有没有办法让客户离开两个房间的任何一个加入? – kbariotis 2013-09-29 14:38:06

+0

我不确定。您可以将2个房间存储在一个数组中,然后执行循环并取消订阅。或者可能有断开功能。 (我从来没有用过) – 2013-10-14 12:09:27

+0

@kbariotis完全。创建一个类似于“离开”的消息,让你的客户发送一个他想离开的房间的名字。然后连接“断开”按钮发送此类消息。服务器端,请订购套接字离开给定的房间。 – 2015-05-13 09:23:51