服务器端Socket.IO未加入房间并正确发出消息

问题描述 投票:0回答:1

我正在开发一个在客户端和服务器端使用 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。当不输入房间名发送消息时,它完美地广播消息。

任何有关如何解决此问题的帮助或见解将不胜感激。

reactjs node.js express websocket socket.io
1个回答
0
投票

试试这个:

用于向房间发送消息 -

// via io
io.to("some room").emit("some event");

// via socket
socket.to("some room").emit("some event");

参考:https://socket.io/docs/v3/rooms/

© www.soinside.com 2019 - 2024. All rights reserved.