Node.js Nodejs-Socket.io如何检测哪个房间发送了数据?

Node.js Nodejs-Socket.io如何检测哪个房间发送了数据?,node.js,socket.io,Node.js,Socket.io,我正在构建一个游戏,玩家要开始游戏,他们应该按下一个按钮,当同一个房间里的每个人都点击游戏开始的按钮时 问题是,我只做到了这一点,没有指定哪个房间发送了“我准备好了”消息,所以我只计算连接的玩家的数量,而不管他们来自哪里: 代码以给出一个示例: socket.on('userReady', function(){ userReadyCounter++; if(userReadyCounter === connectionCounter){ gameDuration

我正在构建一个游戏,玩家要开始游戏,他们应该按下一个按钮,当同一个房间里的每个人都点击游戏开始的按钮时

问题是,我只做到了这一点,没有指定哪个房间发送了“我准备好了”消息,所以我只计算连接的玩家的数量,而不管他们来自哪里:

代码以给出一个示例:

socket.on('userReady', function(){
    userReadyCounter++;
    if(userReadyCounter === connectionCounter){
        gameDuration = 180
        io.sockets.in(socket.room).emit('startGame');
        io.sockets.in(socket.room).emit('newSentence', sentences[socket.sentenceCounter]);
    }
})
连接计数器部件:

socket.on('joinedRoom', function(roomData){
    socket.username = roomData.username;
    socket.room = roomData.roomname;
    socket.sentenceCounter = 0;
    connectionCounter++;

    socket.join(socket.room);
    socket.broadcast.to(socket.room).emit('userJoined', socket.username);

});
客户:

function userReady(){
    socket.emit('userReady');
}
所以每次用户发送消息时,我都不知道他们来自哪里


我这样做是否有误?

您无法在客户端上检测到哪个房间发送了数据。首先,房间不发送消息或数据。服务器发送数据。服务器可以迭代一个房间中的所有连接并发送给它们,但消息实际上不是由房间发送的,而是由服务器发送的。而且,消息中根本没有任何关于它与哪个房间相关的信息

因此,要知道消息在客户端中与哪个房间关联,唯一的方法是,如果您之前创建了与某个房间的关联,以便客户端只知道它接收的消息与特定房间关联,或者如果您在消息本身内部发送与消息关联的实际房间。这将是最简单的方案:

socket.room = roomData.roomname;
socket.join(socket.room);
socket.broadcast.to(socket.room).emit('userJoined', {
    user: socket.username,
    room: socket.room
});

然后,每一条到达客户端的类似消息都会准确地通知客户端它与哪个房间关联。

您无法在客户端上检测到哪个房间发送了数据。首先,房间不发送消息或数据。服务器发送数据。服务器可以迭代一个房间中的所有连接并发送给它们,但消息实际上不是由房间发送的,而是由服务器发送的。而且,消息中根本没有任何关于它与哪个房间相关的信息

因此,要知道消息在客户端中与哪个房间关联,唯一的方法是,如果您之前创建了与某个房间的关联,以便客户端只知道它接收的消息与特定房间关联,或者如果您在消息本身内部发送与消息关联的实际房间。这将是最简单的方案:

socket.room = roomData.roomname;
socket.join(socket.room);
socket.broadcast.to(socket.room).emit('userJoined', {
    user: socket.username,
    room: socket.room
});

然后,客户端收到的每一条这样的消息都会准确地通知客户端它与哪个房间关联。

您应该有一些东西来识别不同的用户。比如会话,或者仅仅是作为
userReady
事件的参数传递的
username
。阅读这里你应该有一些东西来识别不同的用户。比如会话,或者仅仅是作为
userReady
事件的参数传递的
username
。在这里读一读