javascript - javascript-如何在客户端和服务器上同步socketIO连接ID?

我有一个javascript游戏客户端,它使用SocketIO向nodeJs服务器发送消息,多个用户可以单独打开GameClient,并且向服务器发送消息。


GameClient


GameClient ---> NodeJS Server


GameClient



服务器可以使用io.to(socketid).emit()向特定客户端发送消息,代码看起来像这样:

客户


this.socket = io({ timeout: 60000 })


this.socket.on('connect', () => Settings.getInstance().socketid = this.socket.id)


this.socket.on('reconnect', (attemptNumber:number) => console.log("reconnecting..."))



const json = JSON.Stringify({socketid:this.socket.id, name:"Old Billy Bob"})


this.socket.emit('user created', json)



服务器(为了清晰起见,只跟踪这个的一个用户),


user = {}



io.on('connection', (socket) => {


 console.log('new connection')


 socket.on('disconnect', () => {


 console.log('user disconnected')


 });



 socket.on('user created', (json) => {


 user = JSON.parse(json)


 });


});



// demo code, send a message to our user


io.to(user.socketid).emit("message to one user")



问题

当客户端浏览器选项卡由于某种原因而变得不活跃时,客户端将断开连接并重新连接并获取新的套接字连接ID ,在Chrome和Safari中会经常发生。

服务器只知道旧的连接id,所以现在它不能再直接发送消息了,如何在客户端和服务器上保持套接字连接id同步?

时间:

你的问题答案非常简单: 你需要知道谁是谁,你已经注意到,这不是socket.id,因为它只标识了套接字,而不是用户,

所以你需要一些认证机制,然后在服务器端保存对(true_id, socket_id)的映射,当消息到达该用户时,你将它广播到所有匹配的socket.io对象。

下面是流程:

  • 客户端对服务器进行身份验证,服务器发送他自己的true_id,客户端信息存储在里面,客户端还可能存储一些session_id或其他一些机制,允许他在断开连接时快速重新认证(请注意: 不存储凭据,它是一个安全问题,
  • 服务器以双向方式跟踪(true_id, socket_id)对,mutlivalue映射(它是实现细节,这个应该使用什么样的结构,也许两个{}对象足够),如果连接终止,则删除(true_id, socket_id)条目,
  • 用户不关心socket_id,他们只关心true_id ,当你想发送直接消息时,你发出的内容是{target_id: true_id, ...}而不是{target_id: socket_id, ...}
  • 服务器收到此类消息时,将检索所有(true_id, socket_id)对并将消息传递给所有这些套接字(请注意: 可能你甚至不需要socket_id,你可以在这里简单地存储socket对象),
  • 如果连接丢失,那么客户端就自动重新连接和重新验证,在服务器端生成新的(true_id, socket_id)对,

让我再次强调一下: 客户根本不关心socket_id ,因为那并不能识别他们,这只是识别的一条通道,只有服务器关心这个信息。

...