如何在socket.io中检查套接字是否存在(连接)有多个节点和socket.io-redis

时间:2015-04-01 12:15:10

标签: node.js nginx redis socket.io socket.io-redis

我正在使用带有多个节点的socket.io,socket.io-redis和nginx。我按照本指南操作:http://socket.io/docs/using-multiple-nodes/

我正在尝试:在一个函数(服务器站点),我想通过socketid查询此套接字已连接或断开连接

我尝试io.of('namespace').connected[socketid],它只适用于当前进程(这意味着它只能检查当前进程)。

任何人都可以帮助我吗?谢谢你的进步。

4 个答案:

答案 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...