我正在遵循这篇优秀的教程,在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);
}
您不需要在套接字本身上添加断开连接事件吗?
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');
});
});
我在评论中有一个更有意义的建议,但由于我没有足够的代表,我无法添加。
因此,我使用JWT身份验证中间件中的userData,在那里我放置房间编号,并在推送房间详细信息的地方重新生成令牌!
有关SocketIO中间件的更多信息有关JWT Auth 的更多信息