dgdev
dgdev

Reputation: 25

Server-side Socket.IO not joining room and emitting messages correctly

I'm working on a real-time chat application using Socket.IO for both the client and server sides. However, I've encountered an issue where the server-side code is not correctly handling room joining and message emission. When a client sends a message to the server with a specified room name, the server should join that room and emit the message to all clients in that room. However server is ignoring the room joining logic and not sending the messages but when I just send without the room it is properly broadcasted to all clients. I think the problem is in else condition. Server side:

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);
        }
      });
      
});

client side:

 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('');
    }
  };

I tried both sending the message to roomname with clicking join and without clicking join button. When send message without entering roomname it is perfectly broadcasting messages.

Any assistance or insights on how to resolve this issue would be greatly appreciated.

Upvotes: 0

Views: 34

Answers (1)

Rohan
Rohan

Reputation: 136

Try this:

For sending message to a room -

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

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

Reference: https://socket.io/docs/v3/rooms/

Upvotes: 0

Related Questions