手机版

Node.js实现数据推送

时间:2021-11-04 来源:互联网 编辑:宝哥软件园 浏览:

场景:后端更新数据推送到客户端(Java部分使用Tomcat服务器)。

后端推送数据的解决方案有很多,比如轮询、Comet、WebSocket等。

1.轮询是后端最低的开发成本,即以传统方式处理Ajax请求和返回数据。在学校,投票总是用于实验室项目,因为它是最安全和最容易实施的。但是,轮询造成的通信资源浪费也不容忽视。无论数据是否发生变化,请求都会照常发送和响应,每个HTTP请求都携带了很长的报头信息。

2.彗星的概念是长连接。客户端发送请求后,后端保持连接,直到连接超时或后端返回数据后再重新建立连接,有效地将通信资源转移到服务器,但实际上消耗了服务器资源。

3.WebSocket是HTML5提供的全双工通信技术,通过“握手”实现客户端和服务器端的通信,实时性好,头小。目前,支持的浏览器如下:

理想情况下,WebSocket应该与Comet结合,像IE8这样的浏览器应该被Comet降级。然而,在这种情况下,后端需要实现两种处理请求的逻辑,即WebSocket和Comet。所以,本文之所以增加Node.js,是为了将处理WebSocket(或者Comet)的逻辑转移到Node.js上,以免“麻烦”后端,因为在现实中,前端开发者推后端开发者并不容易。Node.js作为浏览器和Java业务逻辑层通信的中间层,连接客户端和Tomcat,通过Socket与Tomcat通信(是Socket,不是WebSocket,后端需要实现Socket接口。

在客户端,WebSocket和Comet是通过Socket.io实现的,socket . io会选择合适的实现模式(WebSocket,长拉.)适用于不同的浏览器版本或不同的客户端。Socket.io的引入使得处理WebSocket(或长连接)变得很容易。Socket.io

从客户端导入socket.io:

脚本src=' http : static/js/socket . io . js '/脚本客户端JavaScript代码:

var socket=io . connect(' 127 . 0 . 0 . 1:8181 ');//将数据发送到服务器socket.emit ('from webclient ',JSON data);//接收数据socket . on(' pushtoebclient ',function (data) {//dosth。})从服务器;Node.js服务器代码:

var http=require('http '),app=http.createServer()。listen('8181 '),io=require('socket.io ')。倾听(app);io . socket . on(' connection ',function(socket io){//socket io . on(' from web client ',function(web client data){//dost h。});//客户端断开socketio.on ('disconnected ',function () {console.log('与客户端断开');});//向客户端发送数据socket io . emit(' pushtoebclient ',JSON data);});在客户端和Node.js服务器之间建立良好的连接只是第一步,还需要建立Node.js服务器和Java业务逻辑层之间的连接。此时,Node.js服务器充当客户端,向Tomcat发送一个TCP连接请求。连接成功后,Node.js服务器和Tomcat建立全双工通道,这是唯一的一个。无论有多少客户端请求,它们都会从Node.js服务器转发到Tomcat。同样,Tomcat推送的数据也通过Node.js服务器分发给所有客户端。

这里有一个问题,就是WebSocket连接和Socket连接建立后,两个连接相互屏蔽。Tomcat不知道哪个WebSocket连接发送了数据,也不知道哪个客户端发送了数据。当然,Node.js可以使用会话id发送给Tomcat来识别它是哪个客户端,但是本文采用了另一种方法。

当客户端与Node.js建立WebSocket连接时,每个连接将包含一个实例,这里称为socketIO。每个socketIO都有一个id属性来唯一标识这个连接,这里称为socket_id。使用socket_id在Node.js服务器中构建一个映射表来存储每个socketIO和socket_id之间的映射关系。当Node.js服务器向Tomcat发送数据时,会带着这个socket_id,经过Java部分的一系列处理后,封装每个客户端需要的不同数据,一起返回。返回的数据应该与socket_id有对应关系。这样,当Node.js服务器接收到Tomcat发送的数据时,就会通过上面提到的映射表,由不同的socketIO分发给不同的客户端。

Node.js服务器代码:

var http=require('http '),net=require('net '),app=http.createServer()。listen('8181 '),io=require('socket.io ')。listen(app),nodeServer=new net。socket();//连接到Tomcat nodeserver.connect (8007,' 127.0.0.1 ',function(){ console . log(' connected ');});//存储客户端的WebSocket连接实例var aSocket={ };//与客户端io.sockets.on ('connection ',function(socket io){//从客户端接收数据并将其发送到Tomcat socket . on(' from web client ',function(web client data){//将其存储在映射表aSocket[socketIO.id]=socketIO中;//将socket _ id web client data[' sid ']=socket io . id添加到发送给Tomcat的数据中;//将String数据发送到Tomcat nodeserver . write(JSON . String fy(web client data));});//客户端断开socketio.on ('disconnected ',function () {console.log('与客户端断开');});});//从Tomcat接收数据nodeserver.on ('data ',function(data){ var JSON data=JSON . parse(data . tostring());//为(jsondata.list中的var I){ socket[JSON data . list[I][' sid ']}向客户端分发数据。emit(' pushtoebclient ',jsondata.list [I]。数据);} });上面的代码省略了一些逻辑。例如,Node.js服务器从Tomcat接收的数据分为两种类型,一种是推送的数据,另一种是响应请求的数据。这里,推送的数据被统一处理。

在处理通信时,Node.js发送给Tomcat的数据是String格式的,而从Tomcat接收到的数据是Buffer对象(八进制),需要转换成String再json发送给客户端。

本文只是给出了这两种联系的一个简单例子,具体业务还需要补充很多东西。由于项目引入了Node.js,前端需要承担更多的事情,比如数据处理、缓存,甚至增加很多业务逻辑。

版权声明:Node.js实现数据推送是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。