前提条件:
socketio v4 版本,对应 redis 版本 6.1以上
在这里描述也是github资料:https://github.com/socketio/socket.io-redis-adapter
基本资料:
1.基本连接过程: https://socket.io/docs/v4/redis-adapter/
2.使用的几个方法: https://socket.io/docs/v4/server-instance/#fetchsockets
- github资料:https://github.com/socketio/socket.io-redis-adapter
github中显示了所有方法的使用例子,个人觉得别上面那几个文档好用,这里找到 RedisAdapter 这一章的资料接口
一。连接
使用代码案例,连接方式官方几种方式都有,这里简单写一个,主要看二里面方法的使用:
const rds = redis.createClient("127.0.0.1:6543");
const pubClient = rds;
const subClient = pubClient.duplicate();
subClient.connect().then(() => {
io.adapter(createAdapter(pubClient, subClient));
});
二。广播和不同节点之间连接发送(不同节点一对一发送)
io.on("connection", (socket, req) => {
socket.on("allclients", async () => {
// 参数 rooms 写入房间名称,反馈所有房间内的连接对象
// 这里获取了房间名称为 room-test 的房间内所有连接
// 这里的连接指的是所有 redis adapter 中的连接,
// 也就是说,只要在这个房间内,即使客户端连接的是不同服务器,也能获取到,
// 这时候,只需要自己设置一下用户信息即可,我这里使用的是query参数,
// 你也可以保存一份 client id和用户的对照表
const cons = await io.adapter.fetchSockets({
rooms: ["room-test"],
except: [],
});
if (!cons) {
return;
}
cons.forEach((element) => {
console.log("element.handshake:", element.handshake.query.name);
});
// io.adapter.sockets 这个方法反馈了所有房间内的 client id(包括不同节点)
const cs = await io.adapter.sockets(new Set(["room-test"]));
console.log("cons:", cs);
// allSockets 也可以获取 room-test 房间内所有client id,区别是上面可以多个,这个对应单个房间
console.log("allSockets cons:", await io.in("room-test").allSockets());
});
});
总结
1.获取所有集群中的连接对象
这里以房间“room-test”为例
await io.adapter.fetchSockets({
rooms: ["room-test"],
except: [],
})
2.获取所有集群中的client id
这里以房间“room-test”为例
await io.adapter.sockets(new Set(["room-test"]))
await io.in("room-test").allSockets()
网友评论