您需要将房间号存储在某处(任何数据库)。您必须这样做,因为您必须保持服务器无状态。
让我们假设您只为两个人创建私人聊天。房间号必须是唯一的。所以一种方法是使用用户的电子邮件 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);
}
})