`

Socket.IO 订阅 Redis Channel

阅读更多

       在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命名空间的浏览器端也会收到消息并输出到控制台。

 

分享到:
评论

相关推荐

    Laravel构建即时应用的一种实现方法详解

    本篇文章将详细介绍如何利用Laravel、Redis、Socket.io和Node.js来实现即时通讯。 首先,我们需要了解即时通讯的基本需求。传统的HTTP协议无法实现服务端主动推送信息,因此开发者通常采用轮询或者长轮询技术,但这...

    Chatting-server:聊天软件的服务器端

    在这里,我们使用了`redis-adapter`库,将Socket.IO与Redis连接起来,然后在接收到`chat message`时,将消息发布到`chat-channel`频道。 客户端方面,通常我们需要创建一个HTML页面,使用JavaScript(通常是jQuery...

    springboot+websocket+redis实现聊天室

    前端通常使用JavaScript库如Socket.IO与后端的WebSocket接口进行交互,创建WebSocket连接,监听消息并展示在界面上。同时,前端也需要处理用户界面,包括输入框、发送按钮、聊天窗口等元素的设计。 综上所述,...

    替代Websocket的解决方案:GoEasy.docx

    整个流程与 Redis 的 Pub/Sub 过程类似,整个交互类似 Socket 的长连接,前台首次调用不需要请求后台。 GoEasy 的优点: GoEasy 的主要优点是可以实现实时通信和数据推送,能够实时地将数据推送到前台,从而提高了...

    Laravel开发-laravel-echo-driver

    Laravel Echo驱动程序指的是用于广播事件的接口实现,比如Pusher、Redis、Socket.IO等。这些驱动程序负责将服务器端触发的事件推送到客户端。在Laravel的配置文件`config/broadcasting.php`中,你可以设置默认的广播...

    TypeScript类型定义DefinitelyTyped.zip

    socket.io (by William Orr) SockJS (by Emil Ivanov) SoundJS (by Pedro Ferreira) Spin (by Boris Yankov) Store.js (by Vincent Bortone) Sugar (by Josh Baldwin) SwipeView (by Boris Yankov) ...

    Netty 20道面试题和答案.docx

    1. Netty 的接收和发送 ByteBuffer 采用 DIRECT BUFFERS,使用堆外直接内存进行 Socket 读写,不需要进行字节缓冲区的二次拷贝。 2. Netty 提供了组合 Buffer 对象,可以聚合多个 ByteBuffer 对象,用户可以像操作一...

    Java 面试资料.zip

    6. **IO流与NIO**:了解传统IO流的分类,掌握文件读写、对象序列化,以及新推出的NIO(非阻塞IO)模型和Channel、Buffer、Selector的概念。 7. **反射**:理解反射的用途,如何通过Class对象获取类的信息,动态创建...

    echo-server:Viblo Echo服务器

    这会根据`package.json`中的依赖列表自动下载并安装所有必要的模块,如`socket.io`和`laravel-echo-server`。 3. **配置服务器**:配置文件可能位于`config.example.json`,你需要复制并重命名为`config.json`。在...

    java面试100题目(X).rar

    5. **IO流**:包括字节流、字符流、对象序列化、文件操作、缓冲流、转换流、管道流,以及NIO(New IO)和NIO.2(Java 7引入的Channel和Buffer)的概念和使用。 6. **网络编程**:TCP和UDP的区别、Socket编程、HTTP...

    advanced-java-master.zip

    - NIO(非阻塞I/O):Channel、Buffer、Selector的使用,提高系统性能。 - AIO(异步I/O):Java 7引入的新特性,处理高并发I/O场景。 4. **网络编程** - Socket编程:客户端和服务端的建立连接,数据传输。 - ...

    java面试宝典.rar

    - NIO(New IO):Channel、Buffer、Selector等核心概念。 6. **反射**: - 如何通过反射获取类信息、创建对象、调用方法和访问字段。 - 反射在实际开发中的应用,如配置文件加载、动态代理等。 7. **网络编程*...

    java程序员面试宝典

    2. NIO:非阻塞I/O的特点,Channel、Buffer、Selector的使用,以及Socket通信的实现。 五、网络编程 1. Socket编程:TCP和UDP协议的理解,以及基于Java的网络通信实现。 2. HTTP协议:对HTTP协议的原理和请求响应...

    java面试宝典.zip

    8. **IO与NIO**:理解传统IO和非阻塞IO(NIO)的区别,熟悉文件操作、流的使用,以及Channel、Buffer和Selector在NIO中的作用。 9. **网络编程**:理解TCP/IP协议,HTTP协议,以及Socket编程的基本原理。 10. **...

    Java面试题2023最新整理二期.zip

    NIO(New IO)和NIO.2(Java 7引入的Channel和Selector)也是面试的热点,它们提供了一种非阻塞I/O模型。 6. **反射机制**:Java反射机制允许程序在运行时动态访问和修改类、对象和方法。面试中可能会问到如何使用...

    张孝祥正在整理Java就业面试题大全

    4. NIO:非阻塞IO模型,选择器Selector,通道Channel,缓冲区Buffer,以及文件系统路径的Path API。 五、反射与注解 1. 反射:Class类的使用,以及动态创建对象、获取和修改字段、方法等。 2. 注解:自定义注解、元...

    java面试(整理).rar

    7. **IO与NIO**:了解传统的InputStream/OutputStream、Reader/Writer以及流的概念,理解NIO(非阻塞I/O)的优势和使用场景,包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。 8. **反射**:理解反射...

    Java面试题资料超全.rar

    - NIO(New IO):非阻塞I/O,选择器(Selector)和通道(Channel)。 8. **设计模式** - 单例模式、工厂模式、建造者模式、观察者模式等23种经典设计模式。 - 模式在实际项目中的应用和场景分析。 9. **JVM** ...

    JAVA就业2023相关面试题

    14. **NIO(New IO)与NIO.2**:理解通道(Channel)、缓冲区(Buffer)、选择器(Selector)的概念,以及非阻塞I/O的优势。 15. **Java 8新特性**:掌握Lambda表达式、Stream API、Optional类、日期时间API、函数...

    32个Java面试必考点.rar

    16. **网络编程**:理解套接字(Socket)编程,知道如何创建服务器和客户端进行通信。 17. **反射**:理解反射机制,能动态获取类信息,创建对象并调用方法。 18. **注解(Annotation)**:了解注解的使用,知道...

Global site tag (gtag.js) - Google Analytics