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

时间:2017-01-16 02:10:18

标签: node.js socket.io

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

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

代码举例:

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

因此,每当用户发送消息时,我都无法分辨他们来自哪里......

我这样做不正确吗?

1 个答案:

答案 0 :(得分:2)

您无法在客户端检测到哪个房间发送了数据。对于初学者,房间不发送消息或数据。服务器发送数据。服务器可以遍历房间中的所有连接并发送给它们,但是消息实际上不是由房间发送的 - 它是由服务器发送的。并且,该消息根本不包含与其相关联的房间的任何信息。

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

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

然后,到达客户端的每条此类消息都会告知客户端与其关联的房间。