У меня есть JavaScript GameClient, который использует SocketIO для отправки сообщений на сервер nodeJs. Несколько пользователей могут открывать GameClient отдельно и отправлять сообщения на сервер.
GameClient
GameClient ---> NodeJS Server
GameClient
Сервер может отправлять сообщения определенным клиентам, используя io.to(socketid).emit()
. Код выглядит примерно так:
CLIENT
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)
SERVER (упрощено для ясности, просто отслеживая одного пользователя здесь)
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")
ПРОБЛЕМА
Когда вкладка браузера клиента вообще по какой-либо причине становится неактивной, клиент отключается и повторно подключается и получает новый идентификатор подключения к сокету. На самом деле это часто случается в Chrome и Safari.
Сервер знает только старый идентификатор соединения, поэтому теперь он больше не может отправлять прямые сообщения. Как сохранить синхронизацию идентификатора соединения сокета на клиенте и сервере?
Поскольку сервер также получает событие повторного подключения, как он узнает, какой пользователь повторно подключился?