Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如果应用程序使用群集并在不同端口上的多个进程中运行,如何使用socket.io向特定客户端发送消息?_Node.js_Socket.io - Fatal编程技术网

Node.js 如果应用程序使用群集并在不同端口上的多个进程中运行,如何使用socket.io向特定客户端发送消息?

Node.js 如果应用程序使用群集并在不同端口上的多个进程中运行,如何使用socket.io向特定客户端发送消息?,node.js,socket.io,Node.js,Socket.io,应用程序以群集模式启动,每个工作程序都要使用redis适配器建立到套接字的连接: app.set('port', httpPort); let server = http.createServer(app); let io = require('./socketServer')(server); io.adapter(redis({host: host, port: port})); app.set('io', io); 然后,我们连接主socket.io文件(sock

应用程序以群集模式启动,每个工作程序都要使用redis适配器建立到套接字的连接:

app.set('port', httpPort);
    let server = http.createServer(app);
    let io = require('./socketServer')(server);
    io.adapter(redis({host: host, port: port}));
app.set('io', io);
然后,我们连接主socket.io文件(socketServer),在对socket和on.connection事件进行授权后,我们将sessionID保存在变量socketID中,并将当前socket连接存储在array
io.clients

io.sockets.on('connection', (socket) =>{
        var socketID = socket.handshake.user.sid;     
        io.clients[socketID] = socket;
        io.clients[socketID].broadcast.emit('loggedIn',socket.handshake.user.data);

        socket.on('disconnect', () =>{
            delete io.clients[socketID];
        });
});
在nodejs应用程序之前,我们有nginx和定制的“上游”来组织“粘性会话”()。 然后,当我们想向特定客户发送一条消息时,我们已经从控制器获得了id user,并获得了id的会话id(我们在redis中预先授权保留这些通信),然后只发送一条消息:

this.redis.getByMask(`sid_clients:*`,(err,rdbData) =>{
            Async.each(clients,(client,next)=>{
                let sid = `sid_clients:${client}`;
                let currentClient = rdbData[sid];
                if(!currentClient || !this.io.clients[currentClient]) return next();
                this.io.clients[currentClient].emit(event,data);
                return next();
});
当我们在单个进程中运行应用程序时,它可以正常工作。但在群集模式下运行时,这不起作用。连接消息“loggedIn”发送给所有进程上的所有客户。但是,如果一个进程向另一个进程中连接到服务器的客户端发送消息不起作用,因为每个进程都有自己的数组
io。客户端总是有不同的内容,因此消息无法到达正确的客户


那么,如何在集群模式下向特定客户机发送事件呢?如何将所有连接的插座保持在一个位置,以避免类似我的情况?

嘿,伙计,你找到答案了吗?我在找这个too@MiltonFilho,使用
io.to
与roomsHey man对话你找到答案了吗?我在找这个too@MiltonFilho,对房间使用
io.