我正在使用带有多个节点、socket.io-redis 和 nginx 的 socket.io。我遵循本指南:http ://socket.io/docs/using-multiple-nodes/
我正在尝试做:在一个函数(服务器站点)上,我想通过 socketid 查询此套接字已连接或断开连接
我试过io.of('namespace').connected[socketid]
了,它只适用于当前进程(这意味着它只能检查当前进程)。
任何人都可以帮助我吗?感谢提前。
我正在使用带有多个节点、socket.io-redis 和 nginx 的 socket.io。我遵循本指南:http ://socket.io/docs/using-multiple-nodes/
我正在尝试做:在一个函数(服务器站点)上,我想通过 socketid 查询此套接字已连接或断开连接
我试过io.of('namespace').connected[socketid]
了,它只适用于当前进程(这意味着它只能检查当前进程)。
任何人都可以帮助我吗?感谢提前。
如何使用 socketid 检查套接字是否处于活动状态(已连接)我尝试了 namespace.connected[socketid],它仅适用于当前进程。
正如您所说,单独的进程意味着套接字仅在它们首先连接到的进程上注册。您需要使用socket.io-redis将所有节点连接在一起,您可以做的是每次客户端连接/断开连接时广播一个事件,以便每个节点都有一个更新的所有客户端的实时列表。
在这里查看
如上所述,您应该使用 socket.io-redis 让它在多个节点上工作。
var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
我有同样的问题,在我方便的时候没有解决方案。所以我做了一个客户端日志来查看我可以使用的不同方法和变量。有client.conn.readystate
连接“打开/关闭”状态的属性和client.onclose()
捕获连接关闭的功能。
const server = require('http').createServer(app);
const io = require('socket.io')(server);
let clients = [];
io.on('connection', (client)=>{
clients.push(client);
console.log(client.conn.readyState);
client.onclose = ()=>{
// do something
console.log(client.conn.readyState);
clients.splice(clients.indexOf(client),1);
}
});
在多节点集群上部署 Socket.IO 应用程序时,这意味着多个 SocketIO 服务器,需要注意两件事:
使用 Redis 适配器 并启用粘性会话功能:当请求来自 SocketIO 客户端(浏览器)到您的应用程序时,它与特定的会话 ID 相关联,这些请求必须保持与同一进程(Kubernetes 中的 Pod)连接) 起源于他们的身份。
您可以从这个 Medium 故事(提供源代码)https://saphidev.medium.com/socketio-redis ...