引子:随着nodejs蓬勃发展,虽然主要业务系统因为架构健壮性不会选择nodejs座位应用服务器。但是大量的内部系统却可以使用nodejs试水,大量的前端开发人员转入全堆开发也是一个因素。
研究本例主要为后期BI软件,CRM图标系统使用nodejs socket做铺垫.主要实现的是一个分析表图的推送。
socketio.io 代码库以及官网
https://github.com/socketio/socket.io
http://socket.io/
使用redis来实现集群读写 消息 (采用订阅 分发的策略)
https://github.com/socketio/socket.io-redis
在非socket客户行为中发送socket事件(本例在http中调用)
https://github.com/socketio/socket.io-emitter
node_redis
https://github.com/NodeRedis/node_redis
1.安装和基本使用 npm install socketio.io --save
使用因为本人写的例子是Express照搬官网说明,基本代码结构如下
1 2 3 4 5 |
|
2.使用websocket初始化一个echart的图片
socket.js 简单封装下socket.io的一些基本功能,socket.io 提供了三种默认的事件(客户端和服务器都有):connect 、message 、disconnect 。当与对方建立连接后自动触发 connect 事件,当收到对方发来的数据后触发 message 事件(通常为 socket.send() 触发),当对方关闭连接后触发 disconnect 事件。
除去自定义事件之外,本例中还定义了一个额外事件init chart data,用来初始化echart图的数据。
服务端推送消息的主要方式
1.socket.emit() :向建立该连接的客户端广播
2.socket.broadcast.emit() :向除去建立该连接的客户端的所有客户端广播
3.io.sockets.emit() :向所有客户端广播,等同于上面两个的和
此处用到了socket.emit()
socket.io-redis 用来集群推送消息,使用出版/订阅的软件模式,io.adapter()是设置消息缓存方式的,默认为内存,但是集群中内存显然是无法共享的,所以使用socket.io-redis用redis作为缓存中心,注意https://github.com/socketio/socket.io-redis是基于node-redis的,socket.io-redis的说明文档很长时间没有更新了,如果redis有密码一类的雁阵,必须使用
io.adapter(adapter({ pubClient: pub, subClient: sub })); 出版订阅的缓存可以用同一个redis服务器,redis可以部署集群,本例就不在这方面说明了。node-redis2.6之后密码验证使用password为密码参数,而不是官网所写的auth_pass
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
var redis = require('redis'); var adapter = require('socket.io-redis'); var pub = redis.createClient({host:"192.168.0.13", port:"6379", password: "123456" }); var sub = redis.createClient({host:"192.168.0.13", port:"6379", password: "123456" ,return_buffers: true}); io.adapter(adapter({ pubClient: pub, subClient: sub })); //使用socket.io-adapter设置缓存依赖
1 |
|
app.js express项目主入口,创建8080端口web服务器的时候创建一个socket服务
1 2 3 4 5 6 7 8 |
|
推送入口,一个express的路由charts.js,其中2个路由,
simpleBarChart转跳simpleBarChart页面,因为用了handlebars的模版引擎设置layout:false来不包含layout模版片段。
pollingChartData 为推送socket消息请求路由,使用socket.io-emitter.js 来发送事件,注意socket.io-emitter.js也长时间没有人维护了,修改了其中一段代码来实现支持redis密码验证.
socket.io-emitter.js 59行修改如下
|
使用count基数器计数,每次推送重mockdata中取模得到新的数据,通过emitter redis服务器,推送消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
|
前端页面,express引用socket.io后,自动可以通过访问/socket.io/socket.io.js 的前端库,本例中接收了2种socket消息,一种刚进入页面创建socket连接的时候接收的一条init chart data的消息,以及接收通过pollingChartData推送来的new chart data的消息.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
|
最后结果,通过http://localhost:8080/charts/simpleBarChart访问获得一个简单的echart图表,
通过http://localhost:8080/charts/pollingChartData访问推送新数据重绘图表,每次发送一次请求,重新绘制一次图片。
来源:oschina
链接:https://my.oschina.net/u/200350/blog/3004470