Socket.IO 订阅 Redis Channel

标签: Bash Node.js Redis Socket.IO | 发表时间:2016-04-05 08:00 | 作者:
出处:http://harttle.com/

在Node.js程序中,可以借助 Socket.IO来构建实时应用。 然而有时候后台与Socket.IO是异构的,比如Java、Python的Web后台。 这时可以利用 Redis的订阅/发布机制作为中转,连接异构的后台和Socket.IO服务。 本文介绍如何在Socket.IO中订阅Redis Channel。

至于如何在Java/Python/C#中发布消息到Redis Channel,请参照对应语言的Redis SDK。

安装软件

  1. Redis。可以参照官网 http://redis.io/ 来安装,在 这里可以下载。
  2. Node.js。也可以在官网 https://nodejs.org/ 直接下载。

然后创建一个文件夹作为Socket.IO服务器项目,在其中安装 Socket.IO和Node.js的 redis客户端。

   npm install Socket.IO redis --save

简单的Socket.IO服务

创建 app.js文件,写一个基于Node.js HTTP模块的Socket.IO服务器。 我们创建两个命名空间,一个 notification,一个 chatting

   var server = require('http').createServer();
var io = require('Socket.IO')(server);
io
    .of('/notification')
    .on('connection', socket => {
        console.log('user connected to notification');
        socket.on('disconnect', () => console.log('user disconnected'));
    });

io
    .of('/chatting')
    .on('connection', socket => console.log('user connected to message'));

server.listen(3001, () => console.log('Socket.IO listen to port 3001'));

不同的浏览器端可以连接到不同的命名空间,例如连接到 notificaiton

   var socket = io('/notification');
socket.on('message', function (msg) {
    console.log(msg);
});

需要在HTML中引入 <script src="/path/to/Socket.IO.js"></script>,见 http://Socket.IO/download/。更多Socket.IO的例子,请参考: http://Socket.IO/docs/#how-to-use

订阅Redis Channel

在上述服务器文件中引入 redis并创建一个客户端,可以收到所有频道的信息。 可以通过 switch-case来分发各频道的消息。

   var redis = require('redis');
var redisClient = redis.createClient();
var NOTIFICATION_CHANNEL = 'notification_channel', CHATTING_CHANNEL = 'chatting_channel';

redisClient.on('message', function(channel, message) {
    switch (channle){
        case NOTIFICATION_CHANNEL:
            console.log('notification received:', message);
            io.of('/notification').emit('message', message);
            break;
        case CHATTING_CHANNEL:
            console.log('chatting received:', message);
            io.of('/chatting').emit('message', message);
            break;
    }
});
redisClient.subscribe(NOTIFICATION_CHANNEL);
redisClient.subscribe(CHATTING_CHANNEL);

redis.createClient()的参数中可以设置Redis服务器的主机名、端口、密码等信息, 参见对应的 文档

测试执行

启动Socket.IO服务器:

   $ node app.js
Socket.IO listen to port 3001

在命令行(Bash、Zsh…)中打开 redis-cli,并发布一条消息:

   $ redis-cli
127.0.0.1:6379> publish notification "fuck you!"

然后Socket.IO便会输出 notification received: fuck you!,同时所有连接到 /message命名空间的浏览器端也会收到消息并输出到控制台。

相关 [socket io redis] 推荐:

有关socket read

- - 五四陈科学院
以下内容由 [五四陈科学院]提供. 实际开发中,网络程序最可能遇到的就是数据没收到、收到错误数据这样诡异的问题.. 很多时候,都是由于对socket read的细节理解的不一致,导致了程序前后的矛盾. 下面详细阐述整个read的过程. read函数是负责从fd中读取内容.. 当读成功时, read返回实际所读的字节数.

物理IO与逻辑IO

- - 操作系统 - ITeye博客
IO性能对于一个系统的影响是至关重要的. 一个系统经过多项优化以后,瓶颈往往落在数据库;而数据库经过多种优化以后,瓶颈最终会落到IO. 而IO性能的发展,明显落后于CPU的发展. Memchached也好,NoSql也好,这些流行技术的背后都在直接或者间接地回避IO瓶颈,从而提高系统性能. 上图层次比较多,但总的就是三部分.

Socket的速率控制

- - CSDN博客互联网推荐文章
做一个以精确速率向外输出数据的数据源,要完成这个目标,最基础的是:. 1、找到一种精确的计时器,在精确的时间范围内控制数据源以指定的速度向外发送数据. 2、通过对套接字选项和线程优先级的设置减少网络因素对发送速度造成的影响,从而提高发送精度,保证数据的实际发送量尽可能的达到指定的理论发送量.      针对第一个要求,通过寻找到一种时间精度达到微秒级的精确计数器来保证,在硬件支持的情况下可以通过WindowsAPI获取时钟频率以及震荡次数,通过在事件两端分别调用函数得到震荡次数的差值并结合时钟频率可以计算出精确的时间间隔,通过指定的传输速度和精确的延时可以计算出需要发送的数据量.

ZeroMQ(java)中监控Socket

- - CSDN博客架构设计推荐文章
基本上ZeroMQ(java)中基本的代码都算是过了一遍了吧,不过觉得它在日志这一块貌似基本没有做什么工作,也就是我们通过日志来知道ZeroMQ都发生了什么事情. 而且由于ZeroMQ中将连接的建立和重连接都进行了隔离,用户不需要做什么事情来维护连接,当然这样做的好处是使程序员的编码工作变少了,但是当然也有不好的地方,那就是用户失去了对ZeroMQ整个运行阶段的控制.

java socket参数详解:BackLog

- - 开源软件 - ITeye博客
 java socket参数详解:BackLog. 输入连接指示(对连接的请求)的最大队列长度被设置为 backlog 参数. 如果队列满时收到连接指示,则拒绝该连接. backlog参数必须是大于 0 的正值. 如果传递的值等于或小于 0,则假定为默认值. 经过测试这个队列是按照 FIFO(先进先出)的原则.

HTML5 Web socket和socket.io - wishyouhappy

- - 博客园_首页
   HTML5的新特性,用于双向推送消息(例如网页聊天,手机推送消息等). client利用regular http请求webpage. 请求的webpage 执行javascript脚本,open a connection to server.. 有新的信息时服务器和客户端可以相互发送信息(Real-time traffic from the server to the client .

tcp/ip ,http,socket的关系

- - 行业应用 - ITeye博客
  物理层、数据链路层、网络层、传输层、会话层、表示层和应用层.   通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层,.   三者从本质上来说没有可比性,.   socket则是对TCP/IP协议的封装和应用(程序员层面上).   也可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,.

linux异步IO浅析

- Sepher - kouu&#39;s home
知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个CPU密集型的应用中,有一些需要处理的数据可能放在磁盘上. 预先知道这些数据的位置,所以预先发起异步IO读请求. 等到真正需要用到这些数据的时候,再等待异步IO完成. 使用了异步IO,在发起IO请求到实际使用数据这段时间内,程序还可以继续做其他事情).

java nio和io的比较

- - 互联网 - ITeye博客
第一部分:简单介绍NIO.     服务器在合理时间内处理大量客户机的请求的能力取决于服务器使用I/O流的效率,同时为成百上千的客户提供服务的服务器必须能并发的使用I/O服务.     用Java语言写的服务器,由于其线程与客户机之比几乎是一比一,因而易受到大量线程开销的影响,其结果是即导致性能问题,又缺乏伸缩性.

关于socket的一些初步研究

- iDesperadO - keakon的涂鸦馆
这些天在研究Tornado的源码,说实话它的代码过于艰深了,需要绕很多弯才能弄清. 我想其中的问题主要是我不太懂socket,于是就花了些时间学习socket,算是有了些收获,顺便记录在此. 实际上UNIX的设计者很喜欢用类似的方式来处理一类任务,其中数据传输就都被抽象成文件,包括磁盘文件、管道、FIFO和终端等.