繁体   English   中英

在Express中将Redis pubsub消息转发到特定的socket.io客户端

[英]Forward redis pubsub message to specific socket.io client in express

在我的Express服务器中,我正在使用socket.io和Redis pubsub。 服务器订阅Redis消息通道,并在有人通过Redis发布新消息时将Redis消息转发到特定的Websocket客户端。

从我从socket.io和Redis文档中读取的内容中,我可以使用可变socket将消息发送到特定客户端,然后调用socket.broadcast.to(mySocketID).emit

但是在以下代码中,如果我想向redis订阅者中的mySocketID发送消息,该消息超出了io.on('connection')的范围, io.on('connection')怎么办?

 var redis = require('redis'); var server = require('http').createServer(app); var io = require("socket.io")(server); io.on('connection', function (socket) { socket.on('whatever_event', function() { socket.broadcast.to(mySocketID).emit('TEST', 'hello ' + mySocketID); } } var subscriber = redis.createClient(); subscriber.on('message', function (channel, redisMessage) { // I want to send redisMessage to the websocket client // Can I access to "socket" in io.on('connection' ...) ? }); 

不久前,我对WebSockets做过类似的事情(如果我了解您要做什么)。 有效地,我必须在Redis Pub / Sub(纯EventImitter)和websocket之间创建一个进程内事件代理层。 没有此层,您将有很多不必要的连接开销,通过使用它,您可以限制到Redis的打开连接数。

因此, subscriber.on部分发送一个EventEmitter事件( yourEventsObject.emit(/*...*/) )。 然后,在socket.io连接回调中,您可以使用侦听器( yourEventsObject.on(/*...*/) )响应这些事件。 当socket.io连接关闭时,您需要确定并清理这些EventEmitter侦听器,以便关闭套接字不会出错。

这是完整源代码的完整文件,以及描述websockets问题/解决方案文章

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM