首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Socket.IO-redis的socket.io :获取房间中的所有套接字对象

使用Socket.IO-redis的socket.io :获取房间中的所有套接字对象
EN

Stack Overflow用户
提问于 2019-11-21 14:59:20
回答 2查看 2.8K关注 0票数 2

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

我已经找到了方法clients,如果在方法in之后链接,则返回在一个房间中连接的所有套接字:

代码语言:javascript
复制
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的多实例/节点

  • socket.io-redis:

  • socket.io: 2.3.0

  • 5.2.0
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-06 08:19:50

我不确定下面的代码是否有效,但是我认为通过使用socket.io-redis提供的customHook,我们可以得到基于redis的多节点的socket.handshake.session。

我希望下面的代码能有所帮助。

代码语言:javascript
复制
// 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???
    }
});

// set root namespace
const rootNamespace = socketServer.of('/');

// define customHook
rootNamespace.adapter.customHook = (request, cb) => {
    // every socket.io server execute below, when customRequest requested
    const type = request.type;
    if(type === 'getHandShakeSession'){
        // get all socket objects on local socket.io server
        const sockets = rootNamespace.connected;
        const socketIDs = Object.keys(sockets);
        // get all socket.handshak.session array on local socket.io server
        const sessions = socketIDs.map(socketID => sockets[socketID].handshake.session);
        cb(sessions)
    }
    cb()
}

// request customRequest
rootNamespace.adapter.customRequest({type:'getHandShakeSession'},(err,replies) => {
    //replies are array which element was pushed by cb(element) on individual socket.io server
    //remove empty reply 
    const filtered = replies.filter(reply => reply !== undefined)
    // filtered seems like [[session1,session2,...],[sesssion3,session4,...],..]
    console.log(filtered)
} )
票数 4
EN

Stack Overflow用户

发布于 2019-12-03 05:39:07

Object.keys(io.sockets.sockets);它为您提供房间中所有连接的套接字。

票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58977848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档