广播客户端断开与特定房间的连接

时间:2014-10-25 01:17:23

标签: node.js socket.io

我正在关注这个优秀的Tutorial,以便在node.js

中制作我的第一个测试游戏

一切都很完美。即使我将它从两个玩家改为三个玩家,仍然工作正常。但不幸的是,该教程没有涵盖disconnect event。服务器上的每个事件都发生在一些客户端操作上。例如加入游戏,回答点击等。

但是,当一个用户失去他的互联网连接时,我被困在广播给一个房间里的所有客户,因为他没有采取任何行动。通过一些搜索,我发现了类似下面的内容

// Listen for Socket.IO Connections. Once connected, start the game logic.
io.sockets.on('connection', function (socket)
{
    //console.log('client connected');
    initGame(io, socket);
    io.sockets.on('disconnect', function ()
    {
        socket.broadcast.emit('playerDisconnected', 'x has disconnected');
    });
});

这不起作用。而且我无法理解如何知道以及如何告诉房间中的​​用户谁已经消失了。请指导我,我可以做些什么来澄清问题。

修改

在给定答案的帮助下,我能够向连接到服务器的所有客户端广播断开连接事件。但是我只能向特定游戏客户发出什么意味着从这里我可以获得gameid / roomid 。我在工作代码中看到类似游戏套接字的东西/(以下是它)。但是我尝试了简单的socket.emit('playerDisconnected', 'x has disconnected');它不起作用而emit.broadcast有效,但不是我需要的

function initGame(sio, socket)
{
    io = sio;
    gameSocket = socket;
    gameSocket.emit('app_ev_connected', { message: "You are connected!" });

    gameSocket.on('serv_ev_playerJoinGame', playerJoinGame);
    gameSocket.on('serv_ev_getRooms',getRooms);    
}

2 个答案:

答案 0 :(得分:2)

您是否需要在套接字本身上添加disconnect事件?

io.sockets.on('connection', function (socket) {

   initGame(io, socket);
   socket.on('disconnect', function () {
      //socket.broadcast.emit('playerDisconnected', 'x has disconnected');
      socket.broadcast.emit('playerDisconnected', this.id + ' has disconnected');
      //if you want to emit in particular room
      io.sockets.in('roomName').emit('playerDisconnected', this.id +' has disconnected');
   });
});

答案 1 :(得分:2)

我有一条建议,可以在评论中说得更有意义,但是由于我的代表人数不足,因此无法添加。

因此,我使用JWT身份验证中间件中的userData放置房间号,并在生成房间详细信息的地方重新生成令牌!

有关SocketIO Middleware的更多信息 有关JWT Auth

的更多信息