Socket.io连接加入错误的房间

时间:2017-06-02 04:47:27

标签: javascript node.js express websocket socket.io

当向localhost:3000/:id发出请求时,我想创建一个房间并将客户端添加到其中。然后我希望该客户端所采取的操作仅被广播给该房间中的其他客户端。这是处理该问题的服务器端代码:

app.get('/:id', function response(req, res) {
    io.on('connection', function (socket) {

            socket.join('/game-' + req.params.id);

            socket.on('action', function (action) {
                switch (action.type) {
                    case 'TOGGLE_ACTIVE_PLAYER':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', toggleActivePlayer())
                    case 'SET_SLOT_PREVIEW':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', setSlotPreview(action.colIndex))
                    case 'CLEAR_SLOT_PREVIEW':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', clearSlotPreview(action.colIndex))
                    case 'PLAYER_MOVED':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', playerMoved(action.colIndex))
                    case 'CHECK_FOR_WINNER':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', checkForWinner())
                    case 'CLEAR_BOARD':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', clearBoard())
                    case 'CLEAR_WINNER':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', clearWinner())
                    case 'RESET_GAME':
                        return socket.broadcast.to('/game-' + req.params.id).emit('action', resetGame())
                }
            })
    });
    res.end();
});

我遇到的问题是,当使用新的id param(localhost:300 / newIdParam)建立连接时,会创建一个名为newIdParam的房间,并将该客户端添加到该房间但该客户端也会被不适当地添加到现有的房间。我可以通过检查io.sockets.adapter.rooms对象来告诉客户端在两个房间中:

  '/game-123': 
   Room {
     sockets: 
      { '/#KIq0i-_oaf_mtM8AAAAK': true,
        '/#Sokr_2ROg0culZ6bAAAL': true,
        '/#w6XRgbfF3Q2TIicXAAAM': true },
     length: 3 },
  '/#Sokr_2ROg0culZ6bAAAL': Room { sockets: { '/#Sokr_2ROg0culZ6bAAAL': true }, length: 1 },
  '/#w6XRgbfF3Q2TIicXAAAM': Room { sockets: { '/#w6XRgbfF3Q2TIicXAAAM': true }, length: 1 },
  '/game-456': Room { sockets: { '/#w6XRgbfF3Q2TIicXAAAM': true }, length: 1 } }

注意两个房间都存在套接字ID #w6XRgbfF3Q2TIicXAAAM。同样,通过使用id作为路由参数发出请求来创建这些房间:

localhost:3000/123

该请求将创建一个名为game-123的房间,并自动添加请求客户端。

提前感谢任何想法。

1 个答案:

答案 0 :(得分:0)

如果你需要像用户连接到新房间这样的东西,那么用户不应该是旧房间,因此只有一个房间与用户连接,那么你必须强迫用户离开房间,如下图所示,

socket.on('disconnect', function(){
    socket.leave("roomname");
});