如何在socket.io中基于2个用户创建一个房间?

时间:2016-01-28 10:20:59

标签: node.js sockets socket.io

我的目标是根据两个不同的用户创建一对一的聊天。我能想到的唯一方法是使用socket.io rooms

但现在的问题是我如何创造独特的空间?

例如

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

我是否需要从客户端发出房间,如果是这样,我该如何让它独一无二。想象一下,有成千上万的用户。

聊天应用程序,类似于facebook聊天应用程序。你可以在哪里聊天。

我需要redis或mongodb才能存放房间吗?任何有规模使用socket.io经验的人,请分享您的意见

谢谢!

4 个答案:

答案 0 :(得分:5)

一个房间总是唯一的,当你socket.join('roomname')房间不存在时它会创建,这个套接字会加入它,如果存在,套接字就会加入它。

因此,如果您希望客户A加入客户B的房间,例如客户A,您可以发送如下事件:

socket.emit('joinroom', roomname);

On sever:

socket.on('joinroom', function(data){
     socket.join(data)
  })

无论如何,当一个套接字连接时,它会自动创建并加入自己的房间,这个房间的名称将是套接字的id,所以我认为不需要为两个不同用户的聊天创建新房间。 / p>

您需要的所有内容都是将套接字ID与用户的永久属性相关联。

编辑:

我在这里留下一个简单的聊天应用示例,您可以在其中打开多个对话:

server.js:https://gist.github.com/pacmanmulet/b30d26b9e932316f54b2

index.html:https://gist.github.com/pacmanmulet/6481791089effb79f25f

您可以在此处进行测试:https://chat-socket-io-example.herokuapp.com/

我没有使用房间,当你想要发射到一组插座时,它更有意义,而不是只有一个。 希望你能更好地理解我的想法。

答案 1 :(得分:3)

我试图做minimal example,你一次只能在一个房间里(除了你的默认socket.id房间),只有你收到你的同一个房间的其他插座消息。你也可以换房间。

基本前提是,如果套接字A在房间'xyz'中,那么套接字B,在服务器端你可以为套接字A做socket.to('xyz').emit('message', 'hello'),套接字B将接收消息,但是另一个连接不在房间'xyz'的插座C不会。

答案 2 :(得分:2)

您需要将房间号存储在某个地方(任何数据库)。您必须这样做,因为必须使服务器保持无状态。

让我们假设您只为两个人创建私人聊天。房间号必须唯一。所以一种方法是使用用户的电子邮件ID并加入他们,以创建一个新字符串并将其发送回用户。这很棘手,因为我们不知道字符串的加入顺序。因此,我们使用普通电子邮件名称中未使用的字符串(例如:“ @!@!@ !! @!@!@!@!”)将它们加入。我们可以在服务器端将其拆分并比较发出结果。

实际的邮件正文为

   {
        room:a@gmail.comb@gmail.com,
        from:a,
        message:'hi buddy how are you?'
    }

客户附带代码

const roomName = a@gmail.com+'@!@!2!@!@"+b@gmail.com
socket.emit('room', { room: roomName });
    this.socket.on('joined', data => {
        console.log('i have joined', data.room)
        store the room name room: data.room })
    })
socket.on('chat',data=>console.log(`received chat from ${data.from} from the message room ${data.room}`)

使用'@!@!2 @!@'只是因为我们可以在服务器端将它们分开,并检查该空间是否已经存在。

服务器端代码

 const room =[]//this variable you have store in database and retrieve it when needed.
socket.on('room',data=>{
        if(room.length!=0){
            const temp = data.room.split('!@!@2@!@!').reverse().join('!@!@2@!@!');
            if(room.includes(temp)){
                socket.join(temp)
                console.log('joined room',temp)
                socket.emit('joined',{room:temp})
                console.log(room);
            } else if(room.includes(data.room)){
                socket.join(data.room)
                console.log('joined room', data.room)
                socket.emit('joined', { room: data.room})
                console.log(room);

            }
        }else{
            socket.join(data.room);
            room.push(data.room)
            console.log('joined room',data.room);
            socket.emit('joined', { room: data.room })
            console.log(room);
        }

    })

答案 3 :(得分:0)

您可以在服务器运行时创建空间,我使用两个用户ID作为房间ID,例如:' 100-200'用于演示目的。也许你可以使用一些更复杂的方法。