【问题标题】:Adapting my chat app to work with rooms in socket io调整我的聊天应用程序以使用套接字 io 中的房间
【发布时间】:2022-01-15 00:18:27
【问题描述】:

所以我有这个简单的聊天应用程序,并且我正在寻求对其进行调整,以便用户可以使用我创建的 4 个不同的房间。 我将首先尝试解释它是如何工作的,并且我需要得到指导,我需要采取哪些步骤才能使其工作?(考虑到我是初学者)我已经尝试了很多东西但结果总是很糟糕。

客户端:

//Get the room name out of the URL and send it to the server
function getRoomName() {
        let roomName = window.location.toString();
        if(roomName.includes('#') === true){
            roomName = roomName.split("#");
            roomName.splice(0, 1);
            roomName = roomName.toString();
            // Join room
            socket.emit('joinRoom', roomName);
        }
    }

//Here I am changing the URL when clicking on a room button (I got one of these for each button)
proiectFinalRoom.addEventListener('click', () =>{
        window.location.href='#proiectFinal'; 
        roomNameEdit.innerHTML = "#PROIECT-FINAL";  
    })

 sendBtn.addEventListener('click', () =>{
        sendMessage();
    })

    //Here I am sending the message to the server
    function sendMessage(){
        if(messageInput.value === ""){
            return;
        } else {
                   //Calling the getRoomName function (when sending a message)
            getRoomName();

            const text = messageInput.value;
            socket.emit('message', text);
        displayMessage();
        }
    }

服务器端:

io.on('connection', (socket) => {
    socket.on('joinRoom', function(roomName){
        //Join room
        socket.join(roomName);

        //Send messages
        socket.on('message', (message) => {
            socket.broadcast.to(roomName).emit('message', `${message}`);          
        });
    });
});

这是我现在所处的阶段,它绝对不能正常工作。我已经阅读了很多关于 socket.io 和房间的文章,但是由于英语不是我的第一语言,我发现我很难理解代码中的问题所在。

【问题讨论】:

  • 您提到您的代码有很多错误。你能列出你遇到的一些错误吗?这样会更容易帮助你。
  • 老实说,我真的不明白发生了什么。对我来说,每次调用 getRoomName() 时它都会创建一个新用户。 (所以每次你发送消息)连接到几个房间后,消息变得非常混乱。即使您没有与发件人连接到同一个房间,您也会收到消息,您会多次收到相同的消息...
  • 或者他们可能多次连接到同一个房间? (我什至不知道这是否可能)

标签: javascript node.js sockets socket.io


【解决方案1】:

我认为您的服务器端“消息”调用可能过于嵌套。我会做这样的事情(记住套接字维护着房间的集合):

io.on('connection', (socket) => {
    socket.on('joinRoom', function(roomName){
        //Join room
        socket.join(roomName);
    });

    //Send messages
    socket.on('message', (message) => {
        var room = getRoom(socket);
        socket.to(room).emit('message', `${message}`);          
    });
});

function getRoom(socket) {
  var room;
  for (let aRoom of socket.rooms) {
    if (aRoom !== socket.id) {
      room = aRoom;
    }
  }
  return room;
}

在客户端你使用这样的东西。这样你只能加入房间一次(我在这里使用 React):

  const [room, setRoom] = useState<string>();
  ...
  const socket = useContext(SocketContext);

  useEffect(() => {
    if (!room) {
      if (param) {
        var myRoom = param['room'];
        if (!myRoom) {
          socket.emit("ping");
        } else {
          socket.emit('join room', myRoom);
          setRoom(myRoom);
        }
      } else {
        socket.emit("ping");
      }
    }
  }, [room, param, socket]);

【讨论】:

  • 它没有改变任何东西。老实说,我真的不明白发生了什么。对我来说,每次调用 getRoomName() 时它都会创建一个新用户。 (所以每次你发送消息)连接到几个房间后,消息变得非常混乱。即使您没有与发件人连接到同一个房间,您也会收到消息,您会多次收到相同的消息,或者他们可能多次连接到同一个房间? (我什至不知道这是否可能)
  • 我认为你调用你的 getRoomName() 方法太多了。它实际上只需要调用一次。我更新了我的答案,包括我是如何做到的(我在我的例子中使用了 React)
  • 有什么办法可以把它转换成javascript?我以前从未使用过 React,所以我不确定如何实现。
猜你喜欢
  • 2017-01-14
  • 2018-01-29
  • 2016-10-17
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2011-07-30
  • 2020-01-18
  • 1970-01-01
相关资源
最近更新 更多