如何使用socket.io创建动态套接字室

时间:2018-07-03 09:43:40

标签: javascript node.js socket.io

我想使用socket.io来实现多个聊天,我可以使用一个socket.room来实现一对一聊天,但是我想创建多个套接字来与多个人并行聊天

下面是我在git中获得的示例,但我无法理解它如何用于多次聊天,任何人都可以解释
服务器端

io = socketio.listen(server);

// handle incoming connections from clients
io.sockets.on('connection', function(socket) {
// once a client has connected, we expect to get a ping from them 
saying what room they want to join
socket.on('room', function(room) {
    socket.join(room);
});
});

// now, it's easy to send a message to just the clients in a given 
room
room = "abc123";
io.sockets.in(room).emit('message', 'what is going on, party 
people?');

 // this message will NOT go to the client defined above
 io.sockets.in('foobar').emit('message', 'anyone in this room yet?');

客户端

  // set-up a connection between the client and the server
 var socket = io.connect();

 // let's assume that the client page, once rendered, knows what room 
 it wants to join
 var room = "abc123";

 socket.on('connect', function() {
 // Connected, let's sign-up for to receive messages for this room
 socket.emit('room', room);
  });

 socket.on('message', function(data) {
  console.log('Incoming message:', data);
 });

1 个答案:

答案 0 :(得分:-1)

想象一下,有多个聊天室的用户可以选择。当他单击特定房间时,将获得该房间的信息:在本例中为ChatRoom1。 客户端套接字(属于单击此会议室的用户)必须首先加入此会议室  →所以这就是为什么:

socket.emit(room, ChatRoom1) 

//另一方面,服务器端会将此客户端的套接字ID添加到该房间:

socket.on('room', function(room) {
    socket.join(room);
});

现在,如果要向属于特定房间的所有套接字发出消息,请在服务器部分上使用以下命令:

 io.sockets.in(ChatRoom1).emit('message', 'what is going on, party 
people?');

→实际上,此命令只是向所有属于ChatRoom1的套接字发送一条消息

→基本上,一个房间只是一个socketId数组

现在在客户端,您有了这个:

 socket.on('message', function(data) {
  console.log('Incoming message:', data);
 });

这只是一个侦听器,您将进入控制台日志: 传入消息:发生什么事了,聚会的人?

您很快就会进入聊天室,您的套接字会加入一个会议室,并会监听每个事件,直到您要求套接字离开会议室为止

因此,现在您可以想象,在您的消息中,您将拥有自己的ID,您的房间ID和您的内容,在发送时,服务器将知道将其发送到何处。

示例: 信息: { 内容:“ blabla”, 用户:我, 日期:现在, RoomId:ChatRoom1 }

每次用户发送消息时,在客户端上: socket.emit('sendMessage',消息)

在服务器端:

socket.on('sendMessage', function(message){
io.sockets.in(message.RoomId).emit('message', message);
})