工作生活

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

2019-07-01  本文已影响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.")

```

上一篇下一篇

猜你喜欢

热点阅读