我正在关注这个优秀的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);
}
答案 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
的更多信息