【发布时间】:2019-10-02 20:03:35
【问题描述】:
我有一个使用 SocketIO 将消息发送到 nodeJs 服务器的 javascript GameClient。多个用户可以单独打开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)
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")
问题
当客户端浏览器选项卡因任何原因变为非活动状态时,客户端会断开连接并重新连接并获取新的套接字连接 ID。这实际上在 Chrome 和 Safari 中经常发生。
服务器只知道旧的连接ID,所以现在它不能再发送直接消息了。如何保持客户端和服务器上的套接字连接 ID 同步?
既然服务器也得到了重连事件,那么它怎么知道是哪个用户重连的呢?
【问题讨论】:
-
您还忘记了
user = {}在所有客户端之间共享。 -
user变量不是共享的吗?它只保存在server.js在节点中运行 -
它在客户端之间共享,它是全局的。即如果客户端 A 发送它的集合,那么客户端 B 再次发送它的集合,如果 A 请求该值,它将成为 B 的数据。
-
啊我明白你的意思,但我只是简化了那里的代码,是的,它应该是一组具有唯一 ID 的用户
标签: javascript node.js websocket socket.io