我正在创建像crazy8这样的纸牌游戏。我已经发布了原型。
我的问题是,当我在游戏中重新加载页面时,socket已断开连接并且我的socket.id已更改。
所以服务器端程序无法识别我。现在,当socket断开连接时,服务器从表中移除播放器。(因为如果服务器不能删除服务器无法识别的播放器,则游戏停止,所以我编程)。但是,如果我能识别用户,我不想删除只是从桌面重新加载页面的玩家。
问题:如何在用户重新加载页面时识别用户?
我认为使用Cookie作为ID最适合此问题。有其他解决方案吗?
答案 0 :(得分:0)
其他选项包括:
我确定还有更多,但这应该足够了
答案 1 :(得分:0)
在阅读了你的问题后,我明白了(如果我错了,请纠正我),一旦用户刷新页面(重新连接他的套接字),套接字ID就会发生变化(显然),你就无法识别用户。
首先,您不应该使用套接字ID跟踪用户,因为每次用户重新连接时套接字ID都会更改。在识别出用户之后,您应该跟踪套接字ID以便与用户进行通信。
因此,我要做的是在服务器端进行“身份验证”事件,并断开那些不发出“authenticate”事件的套接字。此事件可以使用任何形式的凭据(JWT,用户名:密码等)。
用户通过身份验证后,您可以获取该套接字ID并将其映射到用户ID,并使用套接字ID进行进一步的通信。
所以服务器端流程将是这样的:
io.on("connect", function (socket) {
socket.on("authenticate", function(data) {
// do auth and then make other events
// if auth
socket.auth = true;
socket.emit("message", "User authenticated");
});
// If socket fails to authenticate within 3 seconds after connect, disconnect it
setTimeout(function() {
if (!socket.auth) {
socket.disconnect();
}
}, 3000);
});
转到您的应用后,我发现无需身份验证。这不应该是这种情况,因为我可以通过发送他/她的名字来劫持桌上任何用户的位置。
如果您对此感到满意,那么也许您可以跟踪用户名并将其映射到连接上的套接字ID。