java 推送数据给js,Node.js实现数据推送

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

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

1. 轮询对于后端来说开发成本最低,就是按照传统的方式处理Ajax请求并返回数据,在学校的时候实验室的项目一直都采用轮询,因为它最保险也最容易实现。但轮询带来的通信资源的浪费是无法忽视的,无论数据是否改变,都照常发送请求并响应,而且每次HTTP请求都带有很长的头部信息。

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

3. WebSocket是HTML5提供的一种全双工通信技术,通过“握手”实现客户端与服务器之间的通信,实时性好,携带的头部也较小,目前支持的浏览器如下:

1aeaa99226429ea26e9718674e4389fd.png

理想的情况是采取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, long pull..),Socket.io的引入让处理WebSocket(或长连接)变的很容易。Socket.io

客户端引入socket.io:

客户端JavaScript代码:

var socket = io.connect('127.0.0.1:8181');

// 发送数据至服务器

socket.emit('fromWebClient', jsonData);

// 从服务器接收数据

socket.on('pushToWebClient', function (data) {

// do sth.

});

Node.js服务器代码:

var http = require('http'),

app = http.createServer().listen('8181'),

io = require('socket.io').listen(app);

io.sockets.on('connection', function (socketIO) {

// 从客户端接收数据

socketIO.on('fromWebClient', function (webClientData) {

// do sth.

});

// 客户端断开连接

socketIO.on('disconnect', function () {

console.log('DISCONNECTED FROM CLIENT');

});

// 向客户端发送数据

socketIO.emit('pushToWebClient', jsonData);

});

建立好客户端同Node.js服务器的连接只是第一步,下面还需要建立Node.js服务器与Java业务逻辑层的联系。这时,Node.js服务器则作为客户端,向Tomcat发送TCP连接请求。连接成功后,Node.js服务器和Tomcat建立了一条全双工的通道,而且是唯一的一条,不论有多少个客户端请求,都从Node.js服务器转发至Tomcat;同样,Tomcat推送过来的数据,也经由Node.js服务器分发至各个客户端。

这里存在一个问题,就是在WebSocket连接与Socket连接都建立好之后,两次连接彼此之间是屏蔽的。Tomcat不知道是哪次WebSocket连接发送过来的数据,也不知道是哪个客户端发来的数据。当然,Node.js可以利用session 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 (socketIO) {

// 从客户端接收数据,然后发送至Tomcat

socketIO.on('fromWebClient', function (webClientData) {

// 存储至映射表

aSocket[socketIO.id] = socketIO;

// 发送至Tomcat的数据中添加socket_id

webClientData['sid'] = socketIO.id;

// 发送String类型的数据至Tomcat

nodeServer.write(JSON.stringify(webClientData));

});

// 客户端断开连接

socketIO.on('disconnect', function () {

console.log('DISCONNECTED FROM CLIENT');

});

});

// 从Tomcat接收数据

nodeServer.on('data', function (data) {

var jsonData = JSON.parse(data.toString());

// 分发数据至客户端

for (var i in jsonData.list) {

aSocket[jsonData.list[i]['sid']].emit('pushToWebClient', jsonData.list[i].data);

}

});

上面的代码省略了一些逻辑,比如Node.js服务器从Tomcat接收的数据分为两种,一种是推送过来的数据,另外一种是响应请求的数据,这里统一处理推送过来的数据。

在处理通信时,Node.js发送至Tomcat的数据是String格式,而从Tomcat接收的数据为Buffer对象(8进制),需要转化为String之后再转化为json发送至客户端。

本文只是给出一个这样两次连接的简单例子,具体的业务中需要加入许多东西。既然在项目中引入了Node.js,就需要前端承担更多的事情,比如对数据的处理、缓存、甚至加入很多业务逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开学季限时免费】下载19880元大数据开发全链路教程(视频+源码)

随着大数据、云计算、物联网、人工智能这些行业的发展崛起,对于大数据人才的需求越来越大,而大数据人才的培养发展周期相对较长,导致了大数据人才短缺,市场供不应求。所以也就出现了大数据开发工程师、数仓工程师、ETL工程师.....…

COM 组件设计与应用(七)

COM 组件设计与应用(七)编译、注册、调用作者:杨老师 一、前言  上两回中,咱们用 ATL 写了第一个 COM 组件程序,这回中,主要介绍编译、注册和调用方法。示例程序你已经下载了吗?如果还没有下载…

人类史上20个“最强大脑”

全世界只有3.14 %的人关注了青少年数学之旅今天给大家说道说道这人类历史上20位最强大脑,这些伟人来自各个不同的时期和领域,他们的思想和贡献对人类日后有着重大的影响,其中包括了众多的科学家,哲学家,诗人&#xff0…

LYNC2013部署系列PART4:群聊部署

前言:本篇文章将介绍LYNC2013群聊服务器的部署,在LYNC2010中,群聊服务还没集成到LYNC2010产品中,需要单独额外部署,群聊客户端也没有集成到LYNC2010客户端中。到LYNC2013中,集成工作全部搞定了。我是习惯了…

不要笑!写 | 还是 || ,还真是一个问题

这么简单的问题还写?先不要笑。打开你代码量最多的项目,搜索|或者&,看看有多少条这样的代码!前不久,我在dotnet/machinelearning上提交了一个pull request。修改内容是把"|"改成"||", 把"&"…

UNIX网络编程——ioctl 函数的用法详解

1.介绍Linux网络程序与内核交互的方法是通过ioctl来实现的,ioctl与网络协议栈进行交互,可得到网络接口的信息,网卡设备的映射属性和配置网络接口。并且还能够查看,修改,删除ARP高速缓存的信息,所以&#xf…

你对求生欲,一无所知!| 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅【1】【2】【3】【4】【5】【6】【7】【8】【9】【10】【11】【12】【13】【14】【15】(图源网络,侵权删)学到了吗?↓ ↓ ↓

C#位图BitArray 小试牛刀

前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进。难缠的布隆过滤器,这次终于通透了位图先看一个问题, 假如有1千万个整数,整数范围在1到…

装上了Visual Studio 2005

为了下Visual Studio 2005,我装上了从来没用过的BT,开着电脑下了一夜,今天早上终于下完了,2.6G呀,多么浩大的工程,比PES5还大。现在的软件动不动就是DVD,要不是还有个刻录机,我的硬盘…

在asp.net core 下定义统一的入参和出参格式

在使用.net core 开发Api的过程中,为了统一输入参数的格式,并增加一些全局必须含有的字段,比如:Code,Message,Lang等等,能采取的变通方式还是有几种的,然而都不够优雅,为…

泰勒定理的奇闻轶事

全世界只有3.14 %的人关注了青少年数学之旅泰勒展式 (Taylor expansion) 的剩余项救人一命!在俄国革命期间(1917年左右),数学物理学家塔姆 (Igor Tamm) 外出找食物,在靠近敖德萨 (Odessa) 的乡间被反共产主义的保安人员…

6月统计|.NET薪资一旦高起来,岂是其他语言能比的!

全国程序员6月平均薪资出来了,帝都和魔都平均工资超过18k,你被平均了吗?而中位数17k,你拖后腿了吗?当然,.NET开发者的目标不是平均工资,而是double!年初跳槽季,腾讯、阿里…

剑桥大学的下午茶,为何能喝出六十位诺贝尔奖获得者?

全世界只有3.14 %的人关注了青少年数学之旅英国人的骄傲是他们有世界上最古老的大学,创立于1209年的剑桥大学。英国剑桥大学每天下午有两个小时的时间,常常有计划、有组织地安排不同学科的权威教授一起在学校咖啡屋或茶园共进下午茶。在这里,…

使用bat来运行cygwin,执行脚本(命令)

2019独角兽企业重金招聘Python工程师标准>>> 这是一个没有意义的问题。 既然要跑脚本。为啥不直接在linux服务器上运行。 这个不是个人能决定的。 一般我都将功能写成jar,或者py, 然后编写bat文件, 如果是java的话,“java -jar…

.NET 下载、文档访问新姿势

dot.net 新的重定向Intro不知道大家之前有没有注意过,如果你访问 https://dot.net 的时候会自动地重定向到 https://dotnet.microsoft.com,想要访问 https://dot.net/download 的时候还是会重定向到 https://dotnet.microsoft.com,不会带着…

excel保存成matlab,matlab数据保存为excel文件

读取:A xlsread(‘Excel路径Excel的名称‘,‘工作表名称‘)例子:A xlsread(‘创新班.xlsx‘,‘Sheet2‘)A xlsread(‘创新班.xlsx‘,‘Sheet2‘,‘a1:c1‘) %读取a1 b1 c1的数据不写工作表名称,默认是第一个。写入:…

客户想你死系列,哈哈哈设计师不容易啊! | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅(图源网络,侵权删)学到了吗?↓ ↓ ↓

DropDownList 選項改變確認腳本

需要這個, 到網找了某先生的腳本改了改 staticpublicstringDropDownListSelectChangeConfirmScript(stringdropDownListId,stringmessage){ string script " <script> \n" " var fooIndex; \n" " function saveIndexes() \n&…

王炸!Azure云助力.NET6现高光时刻(VS2022实战尝鲜)

Azure 是一个云平台&#xff0c;旨在简化构建新式应用程序的过程。无论是选择完全在 Azure 中托管应用程序&#xff0c;还是使用 Azure 服务扩展本地应用程序&#xff0c;Azure 都可以帮助你创建可缩放且可维护的可靠应用程序。凭借你已在使用的工具&#xff08;如 Visual Stud…

求生之路:博士生涯的17条简单生存法则

全世界只有3.14 % 的人关注了青少年数学之旅Next Scientist 是一个专门帮助博士生获取并保持动力、实现毕业和指导在业界求职的网站。本文作者 Julio Peironcely 就是 Next Scientist 的创始人和编辑&#xff0c;曾在荷兰莱顿大学的 PhD 期间做代谢组学和代谢产物鉴定的研究。在…