百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

服务器怎么向客户端推送消息?

myzbx 2025-01-12 16:55 36 浏览

前言

最近内部使用的web管理后台系统中新增了一个报销单审批的功能,由员工发起报销申请,然后首先直属主管进行审批,主管审批通过后流程就到了经理那里,经理审批通过后流程再转到财务那里。

本来这功能无非就是些CRUD的功能,没啥难度,但是架不住产品爱搞事啊!产品提出了一个需求:每个审批操作都需要给下一级处理人主动发送一个通知。什么意思呢?比如直属主管审批通过后,系统需要在后台给经理主动推送一条消息,提醒他有报销单需要他处理。

那么web项目要怎么实现服务器向浏览器推送消息呢?

目录

  1. web项目实现消息推送有哪几种方式?
  2. WebSocket是怎么建立起连接的?
  3. Spring Boot集成WebSocket实现消息推送
  4. 总结

web项目实现消息推送有哪几种方式?

传统的web项目浏览器与服务器基于HTTP协议进行交互,一次交互流程总是先由浏览器发送一个HTTP请求到服务器,服务器收到请求后再返回响应数据。

浏览器可以主动发起请求,服务器只能被动进行响应,服务器无法主动联系浏览器,这是HTTP最显著的特征之一。

这样说服务器没有办法将消息主动推送到浏览器了?其实不然,换个思路既然服务器不能主动推送消息,那么就浏览器主动去取好了。

1、ajax轮询

ajax轮询原理很简单,就是让浏览器每隔几秒钟就发送一次请求到服务器询问有没有新消息。

情景再现:

浏览器:服务器老哥,有没有新消息?(发起请求)

服务器:没有新消息(响应)

过了几秒……

浏览器:服务器老哥,有没有新消息?(发起请求)

服务器:没有新消息(响应)

又过了几秒……

浏览器:服务器老哥,我又来啦!有没有新消息?(发起请求)

服务器:没有,你好烦啊!(响应)

重复这个……

2、Long Polling

Long Polling的原理其实和ajax轮询类似,但是做了一些优化,Long Polling采用的是阻塞的方式。浏览器发起请求到服务器,此时如果服务器没有新消息就会一直阻塞不返回响应,直到有新消息才返回,浏览收到返回后,立即再次发起一个新的请求到服务器并继续等待响应。

场景重现:

浏览器:服务器老哥,有没有新消息?没有新消息我就在这一直等(请求)

服务器:目前没有新消息,你先等着……(连接处于阻塞状态)

服务器:来新消息了!(响应)

浏览器:服务器老哥,有没有新消息?没有新消息我就在这一直等(请求)

重复这个过程……

不管是ajax轮询还是Long Polling,了解流程之后可以看出这两种方式都算不上完美的方案。ajax轮询定时发请求,如果这个时候服务器没有新消息,那么这次连接做的就是无用功;Long Polling采用阻塞的方式虽然减少了连接的开销,但是服务器维持连接同样需要消耗资源,如果连接并发很大,服务器将会承受巨大压力。

WebSocket的出现就是为了彻底解决服务器向浏览器推送消息的问题。

WebSocket是HTML5新增的一种通信协议。WebSocket支持双向通信的协议,它和HTTP协议一样通过TCP连接来进行数据传输。但是不同于HTTP协议的是基于WebSocket浏览器和服务器只需要完成一次握手,两者之间就直接建立起长连接,并可进行双向数据传输。

WebSocket是怎么建立起连接的?

WebSocket协议虽然跟HTTP协议是两个协议,但其实两者并不是毫无关系,我更喜欢把WebSocket协议看作是对HTTP协议的一个补充,因为WebSocket建立连接的过程就是借助HTTP协议来完成握手的。

WebSocket建立连接流程:

  1. 浏览器向服务器发出一个HTTP请求,请求中除了包含常规的信息,还在请求头中表明希望将本次通信的HTTP协议升级为WebSocket协议。这个升级请求协议的过程就叫做握手。
  2. 服务端收到升级请求后会验证客户端发送的请求头信息,如果符合规范则同意将HTTP协议替换成 WebSocket协议,并向浏览器返回升级成功的信息。
  3. 双方建立起WenSocket连接就可以互相推送信息了。

在浏览器中看一下实际建立WebSocket连接的过程:

浏览器发送HTTP握手请求阶段:

  • 请求头Connection:Upgrade表明这是一个升级请求;
  • 请求头Upgrade:websocket告诉服务器将请求升级成websocket协议;
  • 请求头Sec-WebSocket-Version:13表明使用websocket协议的版本为13;
  • 请求头Sec-WebSocket-Key校验key,防止恶意攻击者伪造请求;

服务器升级协议返回响应阶段:

  • 响应状态码101表明该次升级请求被正确处理;
  • 响应头Connection:Upgrade和Upgrade:websocket表明协议已升级成websocket;
  • 响应头Sec-WebSocket-Accept服务端根据请求头Sec-WebSocket-Key计算得出,用于检验;

Spring Boot集成WebSocket实现消息推送

因为WebSocket是比较底层的协议,类似于TCP,我们开发web应用并不会直接使用TCP,而是在TCP之上加了一层请求响应模型即HTTP协议。

同样的,在Spring Boot项目中集成WebSocket,我们也不会直接使用WebSocket,而是使用STOMP协议。

STOMP之于WebScoket就像HTTP之于TCP,是一种基于WebScoket的高层协议,STOMP提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。

集成步骤:

1、在pom.xml文件里添加websocket依赖。

2、提供一个websocket配置文件:

  1. 对外暴露/ws端点作为客户端连接websocket的入口;
  2. 定义了客户端可以订阅的主题前缀;

3、客户端页面:

  1. 通过STOMP协议发起webscoket连接;
  2. 订阅系统广播和个人消息两个主题;

4、 服务器推送消息方法:

  1. 所有人只是要连上了服务器都能收到广播消息;
  2. 发给指定用户的消息只有指定个人能收到;

5、运行项目,浏览器打开两个页面分别以用户a和用户b两个不同的身份连接websocket,当服务器发送广播消息时,用户a和用户b都收到了消息;当服务器发送一条给用户a的消息时只有用户a收到了消息。

总结

服务器向客户端推送数据,可以通过HTTP协议以ajax轮询和Long Polling等客户端主动拉数据的方法实现,不管是ajax轮询还是Long Polling,都需要不断的发送请求,这会造成服务器资源的浪费。

WebSocket是一种支持双向通信的协议,通过一次HTTP升级请求完成websocket连接之后就可以多次通信了。


“分享知识,收获快乐”

我是一名程序员,喜欢我的文章欢迎 关注 及 转发,我会经常与大家分享一些工作当中的编程技巧与经验。

相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...