socket.io 和 socket.io-redis:获取房间中的所有套接字对象

我想检索一个房间中连接的服务器端所有套接字。


我发现clients如果在方法之后链接in返回房间中连接的所有套接字的方法:


import * as express from 'express';

import * as SocketIO from 'socket.io';

import * as redisSocket from 'socket.io-redis';

import * as sharedsession from 'express-socket.io-session';


const app = express();


const redisOption = {port: 6379, host: 'XXX'};


// use the RedisStore as express session

const session = session({

  name: 'SESSIONID',

  store: new RedisStore(redisOption),

  secret: 'Ashg8hV77bxFeyLVec',

  resave: false,

  saveUninitialized: false

});

app.use(session);


// start express server

const httpServer = app.listen(80);


// attach the express app to socket.io server

const socketServer = SocketIO(httpServer, { path: '/api/socket.io', origins: '*:*' });


// set redis as socket adpter for multi instance/nodes

socketServer.adapter(redisSocket(redisOption));


// share the express session with socket.io

socketServer.use(sharedsession(session, {autoSave: true}));


// get all client in a room

socketServer.in(room_id).clients((err, clients) => {

    for (let i = 0, e = clients.length; i < e; i++) {

        const client = clients[i];

        console.log(client); // print the socket id


        // HOW RETRIVE THE SOCKET OBJECT???

    }

});

但我需要检索所有套接字会话/握手。


有一种方法可以检索所有套接字会话/握手吗?


旁注:套接字服务器是带有 socket.io-redis 的多实例/节点


套接字.io:2.3.0

socket.io-redis: 5.2.0


有只小跳蛙
浏览 452回答 2
2回答

蝴蝶不菲

我不确定下面的代码是否有效,但我认为通过使用 socket.io-redis 提供的 customHook,我们可以获得基于 redis 的多节点的 socket.handshake.session。我希望下面的代码有所帮助。// get all client in a roomsocketServer.in(room_id).clients((err, clients) => {&nbsp; &nbsp; for (let i = 0, e = clients.length; i < e; i++) {&nbsp; &nbsp; &nbsp; &nbsp; const client = clients[i];&nbsp; &nbsp; &nbsp; &nbsp; console.log(client); // print the socket id&nbsp; &nbsp; &nbsp; &nbsp; // HOW RETRIVE THE SOCKET OBJECT???&nbsp; &nbsp; }});// set root namespaceconst rootNamespace = socketServer.of('/');// define customHookrootNamespace.adapter.customHook = (request, cb) => {&nbsp; &nbsp; // every socket.io server execute below, when customRequest requested&nbsp; &nbsp; const type = request.type;&nbsp; &nbsp; if(type === 'getHandShakeSession'){&nbsp; &nbsp; &nbsp; &nbsp; // get all socket objects on local socket.io server&nbsp; &nbsp; &nbsp; &nbsp; const sockets = rootNamespace.connected;&nbsp; &nbsp; &nbsp; &nbsp; const socketIDs = Object.keys(sockets);&nbsp; &nbsp; &nbsp; &nbsp; // get all socket.handshak.session array on local socket.io server&nbsp; &nbsp; &nbsp; &nbsp; const sessions = socketIDs.map(socketID => sockets[socketID].handshake.session);&nbsp; &nbsp; &nbsp; &nbsp; cb(sessions)&nbsp; &nbsp; }&nbsp; &nbsp; cb()}// request customRequestrootNamespace.adapter.customRequest({type:'getHandShakeSession'},(err,replies) => {&nbsp; &nbsp; //replies are array which element was pushed by cb(element) on individual socket.io server&nbsp; &nbsp; //remove empty reply&nbsp;&nbsp; &nbsp; const filtered = replies.filter(reply => reply !== undefined)&nbsp; &nbsp; // filtered seems like [[session1,session2,...],[sesssion3,session4,...],..]&nbsp; &nbsp; console.log(filtered)} )

当年话下

Object.keys(io.sockets.sockets);&nbsp;它为您提供房间内所有已连接的插座。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript