Node.js+Websocket配合Redis消息订阅实现消息
需求场景:
有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.")
```