我正在开发一个像crazy8这样的纸牌游戏。我已经发布了原型。
看这里,http://himapoyo.com
我的问题是,当我在游戏过程中重新加载页面时,套接字断开连接,并且我的socket.id被更改。
所以服务器端程序无法识别我的身份。现在,当socket断开时,服务器将玩家从表中移除。(因为如果服务器不移除服务器无法识别的玩家,游戏将停止,所以我编写了程序)。但如果我可以识别用户,我不想删除玩家谁只是重新加载的网页从表。
问:当用户重新加载页面时,我如何识别用户?
我认为使用cookie作为ID是解决这个问题的最好方法。还有其他的解决方案吗?
发布于 2016-10-06 16:29:25
其他选项包括:
我相信还有更多,但这应该足够了
发布于 2016-10-07 14:16:56
读完你的问题后,我明白了(如果我错了,请纠正我),一旦用户刷新页面(重新连接他的套接字),套接字ID就会改变(显然),并且您不能识别用户。
首先,您不应该跟踪使用套接字ID的用户,因为每次用户重新连接时套接字ID都会改变。您应该跟踪套接字ID,以便在标识用户之后与用户进行通信。
因此,我要做的是在服务器端创建一个"authenticate“事件,并断开那些不发出"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。
https://stackoverflow.com/questions/39891123
复制相似问题