我的目标是根据两个不同的用户创建一对一的聊天。我能想到的唯一方法是使用socket.io rooms
但现在的问题是我如何创造独特的空间?
例如
socket.on('join', function(room) {
socket.join(room);
});
我是否需要从客户端发出房间,如果是这样,我该如何让它独一无二。想象一下,有成千上万的用户。
聊天应用程序,类似于facebook聊天应用程序。你可以在哪里聊天。
我需要redis或mongodb才能存放房间吗?任何有规模使用socket.io经验的人,请分享您的意见
谢谢!
答案 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'用于演示目的。也许你可以使用一些更复杂的方法。