我正在使用带有多个节点的socket.io,socket.io-redis和nginx。我按照本指南操作:http://socket.io/docs/using-multiple-nodes/
我正在尝试:在一个函数(服务器站点),我想通过socketid查询此套接字已连接或断开连接
我尝试io.of('namespace').connected[socketid]
,它只适用于当前进程(这意味着它只能检查当前进程)。
任何人都可以帮助我吗?谢谢你的进步。
答案 0 :(得分:5)
我怎样才能检查套接字是否存活(连接)我试过的socketid namespace.connected [socketid],它只适用于当前进程。
正如您所说,单独的进程意味着套接字仅在他们首次连接的进程上注册。您需要使用socket.io-redis一起连接所有节点,每次客户端连接/断开连接时,您可以做的是广播事件,以便每个节点具有所有客户端的更新实时列表。
答案 1 :(得分:2)
查看here
如上所述,您应该使用socket.io-redis使其在多个节点上运行。
var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
答案 2 :(得分:1)
我遇到了同样的问题,但在我方便时没有解决方案。因此,我记录了客户端的日志,以查看可以使用的不同方法和变量。连接状态为“打开/关闭”的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);
}
});
答案 3 :(得分:0)
在多节点集群上部署 Socket.IO 应用程序时,即有多个 SocketIO 服务器,需要注意两件事:
使用 Redis 适配器和启用粘性会话功能:当请求来自 SocketIO 客户端(浏览器)到您的应用程序时,它与特定会话相关联-id,这些请求必须与产生它们的 id 的同一个进程(Kubernetes 中的 Pod)保持连接。
您可以从这个 Medium 故事(提供源代码)中了解更多相关信息https://saphidev.medium.com/socketio-redis...