java推送技术_java网络编程 - java服务器推送技术系列方案实战

前言

服务器推送技术(又名Comet)是建立在ARP基础之上的一种非常实用的技术,它广泛应用于Web端,手机APP应用端等。具体很多场景都需要此技术的支撑,包括扫码登录、扫码支付、网页支付、端到端消息轮播推送、数据实时推送、金融数据实时刷新、图表数据实时变化、即时通讯等等都和此技术息息相关。

我们今天来介绍几种常用的服务器推送技术方案及实战。

Ajax短轮询 - 拉模式

基于Ajax(异步JS和XML)的定时轮询。特点:实现简单、短连接、数据同步不及时、对服务器资源会造成一定压力。此模式广泛应用于:扫描登录、扫码支付、天气更新等(腾讯、京东、阿里一直都在沿用此技术并日渐成熟和稳定)。

936b03c79aafaef31d83c8340ca4626d.png

Ajax长轮询 - 拉模式

基于HTTP长连接和AJAX长轮询(long-polling)方式。特点:无需浏览器或APP端任何单独插件支持、长连接,减少网络(三次)握手和四次挥手、对服务器资源要求较高等。此模式常用于实时消息轮播、金融数据即时刷新、数据图表实时刷新等。JAVA服务器端一般采用Servlet3支持的异步任务、延时结果(DeferedResult)等手段实现。

d62f2618feb69313353fe459019ce4c6.png

SSE(Server Send Event) - 推模式

服务器主动推模式。特点:异步非阻塞、多次实时消息的接收,浏览器或APP端可仅发起一次请求、幂等性、长连接等。此模式常用于网页支付、扫码支付等场景。JAVA服务器端采用Spring提供的SseEmitter等实现。

df436e25ebd53a6fa2e2e5ad2ff76c3b.png

EventSource - 推模式

服务器主动推模式。特点:浏览器或APP端需支持或兼容EventSource服务器派发机制、长连接、一次请求,服务器持续多次实时推送。此模式常用于对数据实时性要求较高的场景。

6f59e4613ed2bd3e365b8d6d68331723.png

基于上面的了解和学习后,我们就来前后端配合实战一下以上系列的技术方案。

代码实战

一、EventSource - 推模式/**

*@authorandychen https://blog.51cto.com/14815984

*@description:EventSource服务器推送控制器类*/@Controller

@RequestMapping(value= "/es")

public classEventSourceController {

private static finalLogger log= LoggerFactory.getLogger(SSEController.class);@GetMapping("/index")

publicString index(){

return"eventsource";}

/**

* 主动持久新闻推送的正确姿势

*@paramresponse服务器推送响应

*/@RequestMapping("/push")

public voidpushNews(HttpServletResponse response){

//设置推送内容类型为事件流response.setContentType("text/event-stream");//消息流编码格式response.setCharacterEncoding("utf-8");PrintWriter writer = null;

try{

//获取流写入器writer = response.getWriter();//连续20次推送消息到客户端for(inti=0;i< Constant.WRITE_TIMES;i++){

if(writer.checkError()){

log.error("错误发生,将结束推送...");//数据固定格式:\n\n,双换行符结尾writer.write("data:end\n\n");

return;}

Thread.sleep(2000);writer.write(this.buildSendData());writer.flush();}

log.info("新闻推送达到阈值,将结束推送...");writer.write("data:end\n\n");writer.flush();} catch(Exception e) {

e.printStackTrace();}finally{

if(null!= writer){

writer.close();}

}

}

/**

* 构建发送数据

*@return*/privateString buildSendData(){

String news = Utility.createNews();StringBuilder builder = newStringBuilder("");builder.append("retry:2000\n");builder.append("data:");builder.append(news);builder.append("\n\n");

returnbuilder.toString();}

}

EventSource消息持续推技术

EventSource消息持续推技术 - 演示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值