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

article/2025/10/3 18:14:43

服务器推送技术

服务器推送技术干嘛用?就是让用户在使用网络应用的时候,不需要一遍又一遍的去手动刷新就可以及时获得更新的信息。大家平时在上各种视频网站时,对视频节目进行欢乐的吐槽和评论,会看到各种弹幕,当然,他们是用flash技术实现的,对于我们没有用flash的应用,一样可以实现弹幕。又比如在股票网站,往往可以看到,各种股票信息的实时刷新,上面的这些都是基于服务器推送技术。

Ajax短轮询

Ajax短轮询就是用一个定时器不停的去网站上请求数据。

在这里插入图片描述

下面的代码实现浏览器页面实时显示服务器的当前时间。

服务器端的实现如下:

package com.morris.websocket.shortpoll;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.time.LocalDateTime;@Controller
public class TimeController {@RequestMapping("getTime")@ResponseBodypublic String getTime() {return LocalDateTime.now().toString();}}

html页面实现如下:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>Show Time</title>
</head>
<body>
当前时间为:<span id="timeSpan"></span><script type="text/javascript" src="/js/jquery-1.9.1.min.js"></script>
<script type="text/javascript">function showTime(){$.get("/getTime",function (data) {console.log(data);$("#timeSpan").html(data);})}setInterval(showTime, 1000);
</script>
</form>
</body>
</html>

Comet

基于HTTP长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”,comet有下面两种实现方式:

  • 基于AJAX的长轮询(long-polling)方式。
  • 基于长连接的服务器推模型 Server-sent-events(SSE)。

基于AJAX的长轮询(long-polling)方式。

服务器端实现长轮询可以使用异步任务,这里使用的是Spring MVC对Servlet3.0规范所支持的异步请求方式。

在这里插入图片描述

下面的代码实现服务器端向浏览器页面实时推送新闻。

服务器端的实现如下:

package com.morris.websocket.longpoll;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;@Controller
public class PushNewsController {@RequestMapping("realTimeNews")@ResponseBodypublic Callable<String> realtimeNews() {Callable<String> callable = () -> {try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}int index = new Random().nextInt(Const.NEWS.length);return Const.NEWS[index];};return callable;}}

html页面实现如下:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>新闻推送</title>
</head>
<body>
<h1>每日头条</h1>
<div><div><h2>每日头条新闻实时看</h2><div style="color:#F00"><b><p id="realTimeNews"></p></b></div></div>
</div>
<script type="text/javascript" src="/js/jquery-1.9.1.min.js"></script>
<script type="text/javascript">longLoop();function longLoop() {$.get("/realTimeNews", function (data) {console.log(data);$("#realTimeNews").html(data);longLoop();})}
</script>
</body>
</html>

基于长连接的服务器推模型Server-sent-events(SSE)。

严格地说,HTTP协议无法做到服务器主动推送信息。但是,有一种变通方法,就是服务器向客户端声明,接下来要发送的是流信息(streaming)。也就是说,发送的不是一次性的数据包,而是一个数据流,会连续不断地发送过来。这时,客户端不会关闭连接,会一直等着服务器发过来的新的数据流,视频播放就是这样的例子。

本质上,这种通信就是以流信息的方式,完成一次用时很长的下载。

SSE就是利用这种机制,使用流信息向浏览器推送信息。它基于HTTP协议,目前除了IE/Edge,其他浏览器都支持。

在这里插入图片描述

下面的代码实现服务器端向浏览器页面实时推送贵金属最新价格。

服务器端的实现如下:

package com.morris.websocket.sse;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Random;@Controller
public class NobleMetalController {@RequestMapping("needPrice")public void pushRight(HttpServletResponse response){response.setContentType("text/event-stream");response.setCharacterEncoding("utf-8");Random r = new Random();try {PrintWriter pw = response.getWriter();int i = 0;while(i<10){if(pw.checkError()){System.out.println("客户端断开连接");return;}Thread.sleep(1000);pw.write(makeResp(r));pw.flush();i++;}System.out.println("达到阈值,结束发送.......");pw.write("data:stop\n\n");pw.flush();} catch (Exception e) {e.printStackTrace();}}/*业务方法,生成贵金属的实时价格*/private String makeResp(Random r){StringBuilder stringBuilder = new StringBuilder("");stringBuilder.append("retry:2000\n").append("data:").append(r.nextInt(100)+50+",").append(r.nextInt(40)+35).append("\n\n");return stringBuilder.toString();}
}

html页面实现如下:

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>贵金属</title>
</head>
<body>
<h1>贵金属</h1>
<div><div><h2>贵金属列表</h2></div><div><h2 id="hint"></h2></div><hr><div><div><p>黄金</p><p id="c0" style="color:#F00"></p><b><p id="s0">历史价格:</p></b></div><div><p>白银</p><p id="c1" style="color:#F00"></p><b><p id="s1">历史价格:</p></b></div></div><hr></div>
<script type="text/javascript" src="/js/jquery-1.9.1.min.js"></script>
<script type="text/javascript">function showPrice(index, data) {$("#c" + index).html("当前价格:" + data);var s = $("#s" + index).html();$("#s" + index).html(s + data + " ");}if (!!window.EventSource) {var source = new EventSource('/needPrice');source.onmessage = function (e) {var dataObj = e.data;var arr = dataObj.split(',');$.each(arr, function (i, item) {showPrice(i, item);});$("#hint").html("");};source.onopen = function (e) {console.log("Connecting server!");};source.onerror = function () {console.log("error");};} else {$("#hint").html("您的浏览器不支持SSE!");}</script>
</body>
</html>

各种服务器推送技术的比较

短轮询长轮询SSEWebSocket
浏览器支持度最高很高中(IE和Edge均不支持)
实时性最低较高很高
代码实现复杂度最容易较容易容易
连接性质短连接长连接长连接
适用需要服务极大量或极小量的用户,实时性要求不高准实时性的应用,比较关注浏览器的兼容性实时,基本都是文本交互的应用

应用场景

服务器推送技术常用于二维码登录,二维码支付等场景。

在这里插入图片描述

淘宝登录用的什么?Ajax短轮询,这说明什么?这些技术并没有什么优劣之分,只有合不合适业务的问题。淘宝的痛点是什么?要用有限的资源来为千万级甚至上亿的用户提供服务,如果是用长连接,对于接入的服务器,比如说 Nginx,是很大的压力,光是为用户维持这个长连接都需要成百上千的Nginx的服务器,这是很划不来的。


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

相关文章

【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服务器本身是没有问题&#…

SecureFX_CRT安装

SecureFX_CRT_9安装和注册 SecureFX_CRT_9下载地址&#xff1a;暂时没放上去&#xff0c;最近有点忙&#xff0c;之后再完善下 一、安装 运行SecureFX_CRT安装程序,安装完之后先注册再运行程序 二、注册 注册SecureFX 1、进入安装的目录&#xff08;我的安装目录是…

SecureCRTSecureFX Portable远程连接Linux;上传下载文件

SecureCRT和SecureFX都是由VanDyke出品的SSH传输工具。 SecureCRT是一款非常好用的、支持多标签的SSH客户端&#xff0c;极大方便了管理多个SSH会话。 SecureFX则是一款专业而灵活、支持安全文件传输的SFTP客户端&#xff0c;也支持SCP、SSL等安全协议、以及传统的FTP协议。另…

SecureCRT$SecureFX的安装方法

SecureCRT$SecureFX的安装方法 SecureCRT$SecureFX下载地址 链接&#xff1a;https://pan.baidu.com/s/1SskwXkD6Cc1JKhvcQUIAIw 提取码&#xff1a;n1ql 安装过程 下载完成后&#xff0c;并解压SecureCRT&SecureFX Version.rar 运行安装程序scrt-sfx-x64.9.1.1.2638.…

SecureCRT和SecureFX

1.SecureCRT & SecureFX 介绍 1.1 SecureCRT SecureCRT 是一款终端仿真软件&#xff0c;和 Putty 的功能类似。 不过相比Putty比较简单的功能&#xff0c;SecureCRT 软件还是有许多的优势。比如可以一次创建多个 Tab Page&#xff0c;连接多台远程主机&#xff1b; Butto…

secureCRT及secureFX配置

secureCRT及secureFX配置 secureCRT安装卸载调节字体中文乱码 secureFX展示带.的文件展示带.的文件显示文件夹树右半边详细信息不见了 参考链接 secureCRT 安装 因为是需要注册的一般需要网上的注册码,可以用的,但是没有secureFX 见下链接 也可以直接去网上找那些自带改注册…

linux securefx 传输文件失败,解惑:如何使用SecureCRT上传和下载文件、SecureFX乱码问题...

解惑:如何使用SecureCRT上传和下载文件、SecureFX乱码问题 一、前言 很多时候在windows平台上访问Linux系统的比较好用的工具之一就是SecureCRT了,下面介绍一下这个软件的一些基本使用。 二、上传和下载文件 当我们登录到Linux系统之后最常用的操作就是上传和下载文件了。Sec…

ftp客户端SecureFX 安装教程

一个稳定且功能齐全的ftp客户端工具都可以节省你大量时间和生命,现在有大量的免费或者收费的ftp客户端软件供大家选择。ftp客户端软件有很多,SecureFX 下载速度非常快,功能齐全。mac文件如何安全的传输&#xff1f;为您推荐SecureFX for mac&#xff0c;SecureFX mac版可以更加…

关于 SecureFx传输远程服务器中文显示乱码 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/125101597 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…