美文网首页工作生活
Node.js+Websocket配合Redis消息订阅实现消息

Node.js+Websocket配合Redis消息订阅实现消息

作者: 胥晓冬 | 来源:发表于2019-07-01 17:53 被阅读0次

    需求场景:

    有5部电梯,物联网部门采集了电梯的楼层、运行方向的数据,并将变化值通过Redis消息发布的方式发布出来;需要开发一个后端服务程序,实现订阅Redis的消息,并将变化值推送给Websocket直连的终端。

    场景分析:

    这种场景中,无需确认终端的信息,因此做简单的认证即可。

    之前一直考虑使用Python的Websockets组件实现,使用过程中发现Redis的消息接收很难与Websockets的连接相互协调。

    后来发现Node.js的异步回调能力很强,实现起来比较简单。因此转而使用Node.js实现。

    使用Node.js实现的时候,最先使用"socket.io"模块做,Html的客户端用WebSockets连接服务器,直接提示"Connection closed before receiving a handshake response",无法解决。

    直到后来,采用了nodejs-websocket模块。定义事件,连接和并行发布都很顺利,圆满实现需求。


    ```

    const authKey = "XXXX";

    const serverPort = 8080

    console.log("websocket Initalizing on ", serverPort, " ...")

    var webs = require("nodejs-websocket");

    var server = webs.createServer(function (conn) {

        console.log("New connection main...")

        conn.on('text', function (str) {

            if(str==authKey){

                console.log("Accecept Agent:" + conn.key);

            } else {

                console.log("Unaccecept Agent:" + conn.key);

                close.close();

            };

            //console.log(server.connections);

        });

        conn.on("close", function (code, reason) {

            console.log("Connection Close:", code, reason);

        });

        conn.on("error", function (code, reason) {

            console.log("Connection Error:", code, reason);

        });

    }).listen(serverPort);

    console.log("websocket Initalized success.")

    //redis监听消息的客户端

    console.log("redis Initalizing...")

    var redisClient = require("redis").createClient(6379, "127.0.0.1"); 

    var redisMsgChannel = 'liftstatus'

    redisClient.subscribe(redisMsgChannel);

    redisClient.on('message', function(channel, data){

        console.log('Got a redis message', channel, data);

        if(channel == redisMsgChannel){

            //var data = JSON.parse(data);

            server.connections.forEach(function (conn) {

                console.log("Sending text to:", conn.key)

                conn.sendText(data)

            })

        }

    });

    console.log("redis Initalized success.")

    ```

    相关文章

      网友评论

        本文标题:Node.js+Websocket配合Redis消息订阅实现消息

        本文链接:https://www.haomeiwen.com/subject/qdjncctx.html