如何从 socket.io-redis 发送私人消息(发射)

Posted

技术标签:

【中文标题】如何从 socket.io-redis 发送私人消息(发射)【英文标题】:How to send private message (emit) from socket.io-redis 【发布时间】:2017-07-05 11:02:01 【问题描述】:

我正在使用 Node.js、Socket、io、Redis 开发一个实时应用程序。我尝试从工作人员向一位客户发送私人消息,但它不起作用。 worker 上的数组 io.sockets.connected 为空,无法引用客户端。

主代码:

var io = require('socket.io')(30042); //socket.io(<port>) will create a http server
var redis = require('socket.io-redis');
io.adapter(redis( host: 'localhost', port: 6379 ));
io.on('connection', function (socket) 
    io.sockets.connected[socket.id].adapter.remoteJoin(socket.id, 'new_room', function  (err) );
);

工人代码:

var SocketIO = require('socket.io');
var redis = require('socket.io-redis');
io = new SocketIO(); //start redis socket-io
io.adapter(redis(host: 'localhost', port: 6379)); // where your redis server is located

//send to all users in room - works perfectly
io.to('new_room').emit('chat message', 'Test global msg from worker');

//????
//dont work - io.sockets.connected is empty
io.sockets.connected['socket_id_from_master'].emit('chat message', 'Test private msg from worker');

我做错了什么?

【问题讨论】:

我找到了一条出路:Socket.IO 中的每个 Socket 都由一个随机的、不可猜测的唯一标识符 Socket#id 标识。为方便起见,每个套接字都会自动加入由该 ID 标识的房间。 Worker 代码:io.to(id).emit('chat message', 'Test private msg from worker'); 【参考方案1】:

由于您的工作人员对连接的套接字一无所知,因此您需要从适配器(在本例中为 Redis)获取它们。

要获得连接的套接字,您需要调用: io.sockets.adapter.clients

【讨论】:

以上是关于如何从 socket.io-redis 发送私人消息(发射)的主要内容,如果未能解决你的问题,请参考以下文章

socket.io-redis 尾随字节

将 pm2 的集群模块与 socket.io 和 socket.io-redis 一起使用

使用 socket.io-redis 和 RedisToGo 在 Heroku 上扩展到 2+ dynos

在 Heroku 上使用集群和 socket.io-redis 扩展 node.js socket.io@1.*.*

无法从我的不和谐机器人向用户发送私人消息?

如何在不和谐上发送私人消息[关闭]