长连接/websocket/SSE等主流服务器推送技术比较

article/2025/10/3 17:05:24

最近做的某个项目有个需求,需要实时提醒client端有线上订单消息。所以保持客户端和服务器端的信息同步是关键要素,对此我们了解了可实现的方式。本文将介绍web常用的几种方式,希望给需要服务器端推送消息的同学在选型上有一点启发。

一、推送技术常用的集中实现的实现方式

1.1 短连接轮询:

前端用定时器,每间隔一段时间发送请求来获取数据是否更新,这种方式可兼容ie和支持高级浏览器。通常采取setInterval或者setTimeout实现。

(轮询示意图)

通过递归的方法,在获取到数据后每隔一定时间再次发送请求,这样虽然无法保证两次请求间隔为指定时间,但是获取的数据顺序得到保证。

  • 缺点:

1、页面会出现‘假死’

setTimeout在等到每次EventLoop时,都要判断是否到指定时间,直到时间到再执行函数,一旦遇到页面有大量任务或者返回时间特别耗时,页面就会出现‘假死’,无法响应用户行为。

2、无谓的网络传输

当客户端按固定频率向服务器发起请求,数据可能并没有更新,浪费服务器资源。

1.2 长轮询:

客户端像传统轮询一样从服务端请求数据,服务端会阻塞请求不会立刻返回,直到有数据或超时才返回给客户端,然后关闭连接,客户端处理完响应信息后再向服务器发送新的请求。

(轮询示意图)

长轮询解决了频繁的网络请求浪费服务器资源可以及时返回给浏览器。

  • 缺点:

1、保持连接会消耗资源。

2、服务器没有返回有效数据,程序超时。

1.3 iframe流:

iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长连接,服务器向iframe传输数据(通常是HTML,内有负责插入信息的javascript),来实时更新页面。

  • 前端实现步骤:

1、Iframe设置为不显示。

2、src设为请求的数据地址。

3、定义个父级函数用户让iframe子页面调用传数据给父页面。

4、定义onload事件,服务器timeout后再次重新加载iframe。

  • 后端输出内容:

当有新消息时服务端会向iframe中输入一段js代码.:println("<script>父级函数('" + 数据 +"<br>')</script>”);用于调用父级函数传数据。

  • 优点:

iframe流方式的优点是浏览器兼容好,Google公司在一些产品中使用了iframe流,如Google Talk

  • 缺点:

1、IE、Mozilla Firefox会显示加载没有完成,图标会不停旋转。

2、服务器维护一个长连接会增加开销。

1.4 WebSocket:

WebSocket是一种全新的协议,随着HTML5草案的不断完善,越来越多的现代浏览器开始全面支持WebSocket技术了,它将TCP的Socket(套接字)应用在了webpage上,从而使通信双方建立起一个保持在活动状态连接通道。

  • 原理:

WebSocket协议是借用HTTP协议的101 switchprotocol(服务器根据客户端的指定,将协议转换成为 Upgrade首部所列的协议)来达到协议转换的,从HTTP协议切换成WebSocket通信协议。

  • 具体连接方式:

通过在请求头中增加 upgrade:websocket 及通信密钥(Sec-WebSocket-Key),使双方握手成功,建立全双工通信。

(WebSocket客户端连接报文) (WebSocket服务端响应报文)
  • 通信过程:

websocket是纯事件驱动的,一旦 WebSocket 连接建立后,通过监听事件可以处理到来的数据和改变的连接状态。数据都以帧序列的形式传输。服务端发送数据后,消息和事件会异步到达。WebSocket编程遵循一个异步编程模型,只需要对WebSocket对象增加回调函数就可以监听事件。

(websocket示意图)

前端:

服务端:

1.5 Server-sent Events(sse):

sse与长轮询机制类似,区别是每个连接不只发送一个消息。客户端发送一个请求,服务端保持这个连接直到有新消息发送回客户端,仍然保持着连接,这样连接就可以消息的再次发送,由服务器单向发送给客户端。

  • 原理:

SSE本质是发送的不是一次性的数据包,而是一个数据流。可以使用 HTTP 301 和 307 重定向与正常的 HTTP 请求一样。服务端连续不断的发送,客户端不会关闭连接,如果连接断开,浏览器会尝试重新连接。如果连接被关闭,客户端可以被告知使用 HTTP 204 无内容响应代码停止重新连接。

sse只适用于高级浏览器,ie不支持。因为ie上的XMLHttpRequest对象不支持获取部分的响应内容,只有在响应完成之后才能获取其内容。

二、常用实现的对比

三、项目选型

Websocket需要服务器重新部署,sse可以利用原先的http协议,而我们项目是在高级浏览器环境,场景是需要服务器单向发送给客户端,所以sse更符合我们的需求。

四、项目实践

A应用下单完成后,把订单消息放入到redis缓存中,B应用去获取redis缓存信息判断是否是新订单,否的情况轮询redis缓存,是的情况消息推送给前端。

(后端流程图)

客户端:

然后使用onmessage事件来获取消息

服务端可以自定义类型的事件,对于这些事件,可以使用addEventListener来获取。

服务端:

内容与普通的Controller差不多。只不过相应的方法在路由配置时,将produces属性的文本类型设置成“text/event-stream”即可。

首先通过设置唯一标识符+venueid,获取相应场馆保存在redis中的订单。

常见问题及解决方案:

1、怎么确定推过来的消息是新消息

这里我们设置了一个本地缓存,用来存放上一次从redis中获取的信息,和当前从redis获取的信息做对比,不同,则认为是新信息返回给客户端并标识是新数据。

2、刷新页面原先推送过来的消息消失了

因为在通过redis和本地缓存对比的时候没有区别所以不会推送,这里前端设置一个随机数num,在存入本地缓存时key值多加了num的区分。

3、解决容器超时的问题

后端容器的单个连接超时时间为2分钟,后端每隔3秒钟会轮询一次redis,到第20次的时候,会推送个带有个标识的数据。

4、接口防刷方案

后端记录每次获取到的num值判断总数vnum,超过一定数量返回http 204断开连接。

总结

对于简单的推送需求又不考虑兼容低版本浏览器,推荐使用server-sent Events。

如果需要多条双向数据实时交互或需要二进制传输,推荐websocket。

对于还要考虑低版本浏览器,那么还是用轮询来实现功能。

【作者介绍】本文由携程市场营销研发部武艺嫱和王宇星以及张子祥共同撰写,武艺嫱在市场营销研发部负责前端,王宇星和张子祥在市场营销研发部负责java后端。


https://zhuanlan.zhihu.com/p/31297574


http://chatgpt.dhexx.cn/article/SdwMggGC.shtml

相关文章

Android 服务器推送技术

在开发Android和iPhone应用程序时&#xff0c;我们往往需要从服务器不定的向手机客户端即时推送各种通知消息&#xff0c;iPhone上已经有了比较简单的和完美的推送通知解决方案&#xff0c;可是Android平台上实现起来却相对比较麻烦&#xff0c;最近利用几天的时间对Android的推…

HTML服务器推送技术简介

1. 为什么需要服务器推送&#xff1f; 最大的优点&#xff1a;实时 适用场景&#xff1a;实时股票价格、商品价格、实时新闻、Twitter/weibo timeline、基于浏览器的聊天系统 2. Web交互的发展历程&#xff1f; F5手动刷新 --> AJAX轮询(Polling) --> Comet实时更新 --&g…

服务器推送技术的研究与应用

3&#xff0e;1服务器推送技术(Server Push) 3&#xff0e;1&#xff0e;1服务器推送技术概述 服 务器推送技术是最近Web技术中最热门的一个流行术语&#xff0c;它是继AJAX之后又一个倍受追捧的Web技术。我们可以认为AJAX解决了单用户响应的问题&#xff0c;而 服务器推送则…

SpringBoot2.0实现服务器主动推送SSE技术

文章目录 一、服务器推送技术二、SpringBoot2.0 实现 SSE 一、服务器推送技术 客户端轮询&#xff1a;Ajax定时拉取服务器主动推送&#xff1a;WebSocket WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 WebSocket使得客户端和服务器之间的数据…

服务器推送技术之——SSE

一 点睛 服务器推送技术在日常开发中较为常用。 SSE&#xff1a;Server send Event&#xff1a;服务端发送事件。 本项目推送技术是基于&#xff1a;当客户端向服务端发送请求&#xff0c;服务端会抓住这个请求不放&#xff0c;等有数据更新的时候才返回给客户端&#xff0c…

java web 服务器推送技术--comet4j

1、背景 首先实现服务器推送技术一直一来是B/S应用开发的一块难题&#xff0c;因为是基于HTTP协议的&#xff0c;HTTP协议为无状态&#xff0c;单向性的协议&#xff0c;即&#xff0c;必须由客户端发起一个请求建立连接&#xff0c;服务器接收请求&#xff0c;把数据返回给客…

服务器之间数据文件推送,数据库数据推送到另外服务器

数据库数据推送到另外服务器 内容精选 换一换 该方案优点是简单,容易上手,缺点是停机时间较长。因此它适用于数据量不大,或者允许停机的时间较长,并且在这个时间范围内能够完成的数据。由于云数据库RDS服务提供的服务与原来的数据库服务是完全兼容的,所以对于用户来说,从…

服务器推送技术之短轮询、长轮询、SSE和Websocket

服务器推送技术 服务器推送技术干嘛用&#xff1f;就是让用户在使用网络应用的时候&#xff0c;不需要一遍又一遍的去手动刷新就可以及时获得更新的信息。大家平时在上各种视频网站时&#xff0c;对视频节目进行欢乐的吐槽和评论&#xff0c;会看到各种弹幕&#xff0c;当然&a…

【JavaWeb】小白也能看懂的服务器推送技术(WebSocket和SSE)

一.什么是消息推送 推送的场景比较多&#xff0c;比如有人关注我的公众号&#xff0c;这时我就会收到一条推送消息&#xff0c;以此来吸引我点击打开应用。 消息推送(push)通常是指网站的运营工作等人员&#xff0c;通过某种工具对用户当前网页或移动设备APP进行的主动消息推送…

服务器推送技术

目录 1.前序 2.Ajax短轮询 3.Ajax长轮询 4.SSE 5.WebSocket 6.总结 1.前序 服务器推送技术&#xff1a;不用用户刷新发出请求&#xff0c;服务器主动发送实时信息到客户端。 因为HTTP协议是无状态&#xff0c;单向性的协议。 无状态是说客户端每一次请求都是全新的&…

网络编程五-服务器推送技术

目录 一、服务器推送技术 1、服务器推送技术的兴起 2、应用场景 二、Ajax短轮询 1、定义 2、特点 三、Comet 3.1 AJAX 的长轮询 1、定义 2、特点 3.2 SSE 1、定义 2、特点 四、WebSocket通信 1、什么是webSocket 2、特点 3、WebSocket通信握手 4、WebSocket通…

SecureFx连接Linux系统乱码

最近用SecureFx连接Ubuntu时&#xff0c;出现乱码&#xff0c;经过一番查询资料和实验最终得以解决&#xff0c;希望对大家有所帮助。 1、在选项中设置字符编码为UTF-8 Options -- Session Options -- Teminal -- Appearance 2、在选项的全局选项中找到Securefx的配置文件 Opt…

SecureCRT和SecureFx的使用

SecureCRT和SecureFx的使用 1.SecureCRT和SecureFx登陆中文乱码2.SecureFX打开两个窗口&#xff0c;即本地窗口和远程窗口 1.SecureCRT和SecureFx登陆中文乱码 SecureCRT与SecureFX的常规选项里面已经设置成了UTF-8&#xff0c;但是在SecureCRT中新建的中文文件夹&#xff0c;…

SecureCRT SecureFX中文乱码修改问题

1、一般解决方法&#xff1a;修改UFT-8 选项--会话选项--外观--字符编辑--选择UFT-8--确定【有可能需要重启一下CRT】 2、配置文件修改【好用】&#xff1a; 选项--全局选项--常规--配置文件夹【复制配置文件夹路径&#xff0c;选择要修改的ini文件】 将UTF8"00000000修改…

SecureFX传输速度一直是0

今天学往Linux里传jdk和tomcat时发现传输速度一直不动&#xff0c;检查了Linux的网络连接&#xff0c;也正常&#xff0c;如图&#xff1a; 而且连接ip也对&#xff0c;最后突然想到了权限问题&#xff0c;发现自己登录的不是root用户&#xff0c;又败给了自己...

安装SecureCRT和SecureFX踩过得坑

1.下载 给大家提供两种下载途径吧 1.官网可以下载到最新版的&#xff0c;弊端呢就是需要用邮箱注册一下&#xff0c;登录后才能下载&#xff0c;只有三十天的试用期&#xff0c;如果想长久使用的话还得破解一下&#xff0c;稍微的麻烦一丢丢。 2.https://pan.baidu.com/s/18OZ…

SecureFX之激活教程

SecureCRT激活请参考另一篇文章&#xff1a;SecureCRT激活教程 SecureFX激活教程开始&#xff1a; 步骤1&#xff1a;把激活软件放到该软件的安装目录下&#xff1a;&#xff08;如果找不到安装目录&#xff0c;找到该软件的桌面快捷方式&#xff0c;鼠标右键-----打开文件位…

SecureFx设置密钥登陆

SecureFx设置密钥登陆: 工具,创建公钥下一步密钥类型选RSA 为了更安全&#xff0c;可以设置通行短语 7、将identity.pub上的公钥放到服务器上 ①创建目录 /root/.ssh 并设置权限 [rootlocalhost ~]# mkdir /root/.ssh &#xff08;mkdir 命令来创建目录&#xff09; [ro…

解决SecureFX中文乱码的方法

SecureFX出现乱码&#xff0c;解决办法 1.点击Options选项&#xff0c;选择Global Options 2.点击打开Global Options窗口之后&#xff0c;在左边的General选项下方找到Configuration Path并点击&#xff0c;然后在右边找到路径并将它复制下来&#xff0c;如下图中所示。 3.路径…

解决SecureFX无法连接linux服务器

场景描述&#xff1a; 使用SecureFX无法连接linux服务器。 显示&#xff1a;由于目标计算机积极拒绝&#xff0c;无法连接 但使用它的配套软件SecureCRT&#xff0c;却可以进行连接。 问题分析&#xff1a; 既然CRT可以连接&#xff0c;说明Linux服务器本身是没有问题&#…