One minute
服务器推送消息方法总结及实现(java)
服务器推送消息方法总结及实现(java)
最近在进行web开发时,有用到服务端推送消息这个功能,相信大家在平常开发时,也经常会有这种需求。本文对常用的几种服务器推送消息方法进行整理和总结,并实现使用流的方式推送消息(java)。
服务器推送消息主要有一下几种方法:
- 轮询
- http流
- websocket
- http2.0
下面对各个方法一一进行介绍。
轮询 {.wp-block-heading}
轮询分为短轮询和长轮询。
短轮询即浏览器定时向服务器发送请求,以此来更新数据的方法。如下图所示
(图片来自javascript高级程序设计第三版)
浏览器每隔一段时间向服务器发送一次请求,请求浏览器想要的数据。严格意义上讲:短轮询不是服务器推送的消息,获取的数据也不是实时的。
实现原理:
在浏览器使用定时器setTimeout或setInterval即可。不进行讲解了。
长轮询长轮询是短轮询的一个翻版,或者叫改进版。浏览器向服务器发送一个请求看有没有数据,有数据就响应,没数据就保持该请求,知道有数据再返回。浏览器在服务器返回数据时再发送一个请求。这样浏览器就可以一直获取到最新的数据。长轮询的时间线如下图所示
(图片来自javascript高级程序设计第三版)
实现原理:
在请求响应时,再次发送一个数据请求即可。
http流 {.wp-block-heading}
流不同于上述两种轮询,因为它在页面的整个生命周期内只使用一个 HTTP 连接。具体来说,就是浏览器向服务器发送一个请求,而服务器一直保持连接打开,然后周期性地向浏览器发送数据。
实现:
本例以spring boot框架为基础,github地址如下:https://github.com/xubaodian/JAVA-SSE
下载该实例,并启动。该实例端口号为10000。
我们先对实例进行验证测试,然后再讲解代码。
测试页面地址为:http://localhost:10000/subscribe.html
测试步骤如下:
1、进入http://localhost:10000/subscribe.html,页面如下图所示:
左侧是订阅消息的操作和展示页面,右侧是发布内容的页面。
2、左侧输入订阅消息主题,点击订阅,订阅相关主题消息,例如:输入财经新闻主题FinancialNews,点击订阅,这样就订阅了财经新闻了。
3、在右侧发布内容页面输入主题和内容,点击发布。这样就可以发布内容了。
测试结果如下:
订阅了财经主题新闻,右侧发布了5条新闻,3条财经新闻,一条天气新闻,一条时政新闻,订阅者收到了3条财经新闻推送信息,证明我们工程已经跑起来了,实现了http流推送的最基本功能。
下面,对工程代码进行分析:
java代码
该工程使用spring boot框架,项目端口号为10000,接口代码如下:
有两个接口:
“/subscribe”接口:用于消息订阅,该接口有一个参数topic,即订阅的消息主题。
“/publish”接口:发布消息接口,有两个参数,topic是发布消息主题,content是发布消息内容。
订阅和发布消息的才做都封装在ReqContextUtils类中,ReqContextUtils的代码如下,代码中注释比较多,不再讲解了:
前端代码
前端代码如下,主要就是2个请求,代码中有注释,不再讲解了。
webSocket推送消息
Web Sockets 的是在一个单独的持久连接上提供全双工、双向通信。在 JavaScript 中创建了 Web Socket 之后,会有一个 HTTP 请求发送到浏览器以发起连接。在取得服务器响应后,建立的连接会从 HTTP 协议升级为 Web Socket 协议。
使用spring框架可以很容易实现websocket,这是spring实现websocket的官方教程(非常详细)地址:https://spring.io/guides/gs/messaging-stomp-websocket/ ,需要的可以移步官方网页学习。
http2.0
http2.0的特点是首部压缩,多路复用,请求响应管线化,服务器推送等等,这些特点是建立在http2.0流的基础上的。
具体想要学习http2.0的同学可以上网找下资料,这里只是提一下,不做过多描述了。
69 Words
2020-09-18 00:00