阅读您的问题后,我明白(如果我错了,请纠正我)一旦用户刷新页面(重新连接他的套接字),套接字 ID 就会更改(显然)并且您无法识别用户。
首先,您不应该使用他的套接字 ID 来跟踪用户,因为每次用户重新连接时,套接字 ID 都会改变。在识别用户之后,您应该跟踪套接字 ID 以便与用户进行通信。
所以,我要做的是在服务器端创建一个“身份验证”事件并断开那些不发出“身份验证”事件的套接字。此事件可能需要任何形式的凭据(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。