我正在开发一个在客户端和服务器端使用 Socket.IO 的实时聊天应用程序。但是,我遇到了一个问题,即服务器端代码无法正确处理房间加入和消息发送。 当客户端向服务器发送具有指定房间名称的消息时,服务器应加入该房间并将消息发送给该房间中的所有客户端。然而,服务器忽略房间加入逻辑并且不发送消息,但是当我在没有房间的情况下发送消息时,它会正确广播给所有客户端。我认为问题出在其他情况下。 服务器端:
io.on('connection', (socket) => {
console.log("user connected :", socket.id);
socket.emit('sid', socket.id);
socket.on('joinroom', (roomName) => {
socket.join(roomName);
console.log("User joined room:", roomName);
});
socket.on('message', (message) => {
console.log("Received message from client:", message);
if (message.room === '') {
socket.broadcast.emit('recieve', message.message);
} else {
console.log("Attempting to join room:", message.room);
socket.join(message.room);
console.log("User joined room:", message.room);
io.to(message.room).emit('recieve', message.message);
}
});
});
客户端:
useEffect(() => {
socket.on('sid', sid => {
setId(sid);
console.log("Socket ID received:", sid);
});
socket.on('recieve', (m) => {
console.log("Received message in room:", roomname, " Message:", m);
setMessages(messages => [...messages, m]);
});
}, []);
const joinRoom = () => {
socket.emit('joinroom', roomname);
console.log("Joining room:", roomname);
setMessages(messages => [...messages, `joined to room ${roomname}`]);
}
const sendMessage = () => {
if (messageInput.trim() !== '') {
console.log("Sending message:", messageInput);
socket.emit('message', { room: roomname, message: messageInput });
setMessageInput('');
}
};
我尝试通过单击“加入”和不单击“加入”按钮将消息发送到 roomname。当不输入房间名发送消息时,它完美地广播消息。
任何有关如何解决此问题的帮助或见解将不胜感激。
试试这个:
用于向房间发送消息 -
// via io
io.to("some room").emit("some event");
// via socket
socket.to("some room").emit("some event");