15

我正在使用带有多个节点、socket.io-redis 和 nginx 的 socket.io。我遵循本指南:http ://socket.io/docs/using-multiple-nodes/

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

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

任何人都可以帮助我吗?感谢提前。

4

4 回答 4

5

如何使用 socketid 检查套接字是否处于活动状态(已连接)我尝试了 namespace.connected[socketid],它仅适用于当前进程。

正如您所说,单独的进程意味着套接字仅在它们首先连接到的进程上注册。您需要使用socket.io-redis所有节点连接在一起,您可以做的是每次客户端连接/断开连接时广播一个事件,以便每个节点都有一个更新的所有客户端的实时列表。

于 2015-04-11T22:05:22.763 回答
2

在这里查看

如上所述,您应该使用 socket.io-redis 让它在多个节点上工作。

var io = require('socket.io')(3000);
var redis = require('socket.io-redis');
io.adapter(redis({ host: 'localhost', port: 6379 }));
于 2015-04-15T15:00:54.613 回答
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);
    }
});
于 2019-11-03T02:51:20.770 回答
0

在多节点集群上部署 Socket.IO 应用程序时,这意味着多个 SocketIO 服务器,需要注意两件事:

使用 Redis 适配器启用粘性会话功能:当请求来自 SocketIO 客户端(浏览器)到您的应用程序时,它与特定的会话 ID 相关联,这些请求必须保持与同一进程(Kubernetes 中的 Pod)连接) 起源于他们的身份。

您可以从这个 Medium 故事(提供源代码)https://saphidev.medium.com/socketio-redis ...

于 2021-01-29T17:24:15.037 回答