基于 HTTP 协议的 3 种实时数据获取技术

HTTP请求到服务端详情过程 通过以上几个问题, 主机获得了动态分配的IP地址, 默认网关, 子网掩码, DNS服务器IP地址。DNS一般来说是基于UDP协议的, 构建好DNS报文, 发送UDP报文交给操作系统处理, 在网卡。4. 那么从当前主机是如何获取到DHCP服务端分配的 IP地址, 默认网关, 子网掩码 的呢?本机的IP地址从哪里来?服务端的IP地址从哪里来?先说本机的IP地址, 在连接网络的时候, IP地址可以通过DHCP动态分配获取.网络中通信, 必不可少的是IP地址, 而且使用的是基于TCP的HTTP。 阅读详情

点击上方“芋道源码”,选择“设为星标”

做积极的人,而不是积极废人!

源码精品专栏

 

来源:http://t.cn/E6rUVEV

  • HTTP协议

  • 方式一:短轮询

  • 方式二:长轮询

  • 方式三:WebSocket


HTTP协议

HTTP协议大家都很熟悉了,开始本文之前,首先简单回顾一下HTTP协议。

HTTP协议是建立在TCP协议上的应用层协议,协议的本质是请求----应答:

即对于HTTP协议来说,服务端给一次响应后整个请求就结束了,这是HTTP请求最大的特点,也是由于这个特点,HTTP请求无法做到的是服务端向客户端主动推送数据。

但由于HTTP协议的广泛应用,很多时候确实又想使用HTTP协议去实现实时的数据获取,这种时候应当怎么办呢?下面首先介绍几种基于HTTP协议的实时数据获取方法。

方式一:短轮询

轮询是最普遍的基于HTTP协议获取实时数据的方式,轮询又分为短轮询和长轮询。短轮询非常简单,用一张图表示一下:

客户端向服务端请求数据,服务端立即将数据返回给客户端,客户端没有拿到想要的数据(比如返回结果告诉客户端,数据处理中),客户端继续发请求,服务端继续立即响应,周而复始。

这种实时数据获取的方式比较粗暴,优点在于编程简单,客户端发请求,服务端实时回响应即可。缺点主要有两个:

  • 无效请求多,每一次无效请求都在浪费带宽和服务器的计算资源

  • 对服务器压力大,定时发请求,并发一高,可能服务端瞬间会收到成千上万个请求,很容易拖垮服务器甚至导致宕机

那么短轮询适合哪种使用场景呢,按照我的理解如果数据变化比较频繁或者能预期到数据在短时间内会发生一次变化的场景可以使用短轮询,比如:

用户在PC端买了一个东西唤起网页端,由于PC端和网页端是不通的,我们预期到用户应该很快会完成付款,这种时候为了开发简单短轮询是一种可以使用的方式,直接服务端提供一个接口告诉客户端订单状态,客户端每5秒请求一次即可,拿到结果就可以不用请求了。

使用短轮询注意要做好请求次数上限的控制,比如请求100次还没检测到用户付款,可以弹窗"请完成付款后去我的订单页面查询"就可以不用请求了。

方式二:长轮询

长轮询是另一种实时获取数据的方式,看一下流程:

本质上没有改变,依然是客户端在没有收到自己想要数据的情况下不断发送请求给服务端,差别在于服务端收到请求不再直接给响应,而是将请求挂起,自己去定时判断数据的变化,有变化就立马返回给客户端,没有就等到超时为止。

可以很明显的看到,长轮询的优点就是客户端的请求少了很多避免了无谓的客户端请求,缺点则是服务端会挂起大量请求增加资源消耗且服务器对HTTP请求并发数量是有限制的。

微信网页版的登陆是一个典型的长轮询的例子:

从图上看,客户端不断发送请求到服务器,服务器第一时间并没有给出回应,于是客户端等待,在超时的情况下继续发送请求。

总的来说我理解一般使用长轮询会更多一点,短轮询更加看重的是编程简单,适合小型应用。像微信网页端登录这种,成千上万个用户同时登陆,隔一段时间服务端收成千上个请求去处理哪里受得了,堆机器分摊每台服务器上处理请求的数量终究不是解决问题的办法。

方式三:WebSocket

上面介绍了两种轮询方式,但是两种综合起来都有比较明显的缺点,总结起来有以下几个:

  • 伪实时,即上述两种方式都不是真正的实时,无论短轮询的客户端轮询时间多短,还是长轮询的服务端轮询时间多短,都存在一定程度的延时

  • 所有的轮询只要没有需要的数据返回,都是对计算资源的一种浪费

  • HTTP协议本身是一个重的协议,每一次都必须带有HTTP首部+HTTP头部,实际上对我们来说需要的只是HTTP Body而已,多余的数据都是对带宽的一种浪费

因此,最好我们可以做到的事情是:客户端和服务端之间有一条通路,当服务端数据有变化的时候,服务端可以主动推送到客户端。WebSocket就是HTML5之后为了做到这一点而诞生的一种协议,虽然这是一种新的协议,但也是基于HTTP协议的。

看一下WebSocket的原理,很简单:

WebSocket客户端首先通过HTTP协议发送几个特别的header到服务端,告诉服务端现在我发起的是HTTP请求,但我要升级到WebSocket了:

  • Upgrade:websocket

  • Connection:Upgrade

  • Sec-WebSocket-Key: XXX

  • Sec-WebSocket-Protocol: chat, superchat

  • Sec-WebSocket-Version: XX

只要服务器支持WebSocket协议(Tomcat7、Jetty7之后都是支持WebSocket的),那么服务端收到请求且建立连接成功后会返回Sec-WebSocket-Accept、Sec-WebSocket-Protocol这两个header给客户端,且Http Status为101表示协议切换成功,这样客户端和服务端只要任意一方没有断开连接,就可以基于这一条通路进行通讯了。

再谈一下之前提的WebSocket相比长短轮询对于带宽资源的节省。有一个测试,假设HTTP Header是871字节,WebSocket由于数据传输是基于帧的,帧传输更加高效,对比长短轮询,2个字节即可代替871个字节的Header,测试结果为:

相同的每秒客户端轮询的次数,当次数高达10W/s的高频率次数的时候,轮询需要消耗665Mbps,而WebSocket仅仅只花费了1.526Mbps,将近435倍。

WebSocket做到了真正的实时且大量节省带宽资源,但是我理解也有自己的问题,就是开发成本比较高,这里的开发成本倒不是说自己去实现WebSocket,这个在Java语言层面上直接使用Netty-Socketio即可,API很简单,提供了对WebSocket完整的实现,真正的开发成本在于分布式环境下的数据同步问题。

举个例子,有一个在线聊天系统10W人同时在线,此时有一个用户发了一条1K的语音消息,单机保持10W的连接倒是可以(这里不是HTTP请求,因此不受连接池数影响),问题在于带宽。单机同时向10W用户推送1K语音消息,需要的带宽至少10M,这还只是纯粹推送数据出去,没有考虑到数据进来的场景,实际运行过程中需要的带宽会更多,对于企业来说这是一笔非常大的成本。

因此,大量连接的场景下都会做集群(实际就算没有大量连接,为了高可用性,也会做集群),10W并发分出5台机器,平均每台机器有2W连接,考虑集群下会出现的问题:

客户端1把数据发送到服务器1,服务器1连接的所有客户端都可以推送该条语音,但是问题在于:

  • 服务器2~服务器5连的所有客户端如何拿到数据?简单的一种方式是使用消息队列,将数据通过消息队列发送到所有订阅的服务器上

  • 那如果传输的是一张1M的图片,数据太大不适合使用消息队列怎么办,可以先将数据存储下来,消息队列只发送id,收到消息的服务器再根据id去取真正的数据并推送

  • 如果依赖消息队列,那么不仅仅需要对应用进行代码开发,还需要对消息服务器做分布式集群、做压力测试,保证高可用

  • 2W连接正常预计发送1K的消息是没问题的,但是万一用户发送了1M图片导致远超预估带宽怎么办,是业务上取舍不能发送超过XXX的数据还是技术上处理

其他太多需要考虑的问题没有列出来,总而言之,用WebSocket在大量请求、高并发的场景下,代码开发成本是非常高的。但是由于WebSocket可以做到真正的实时服务端对客户端的数据推送且对带宽资源有大量的节省,因此很多IM、音视频、弹幕等应用都会使用WebSocket。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:


如果你喜欢这篇文章,喜欢,转发。

生活很美好,明天见(。・ω・。)ノ♡

http服务向服务器发送并接受数据--------------HttpClient对象向服务器发送并接受数据 一、public class HttpURLConn { // 发送带参数的Post请求,得到返回的xml字符串 public static String sendPost(String url, String param) throws Exception {  String result = "";  System.out.println("connent_center!");  System.out.println("url="+url);  try {   URL httpurl = new URL 阅读详情

相关推荐

vue+播放直播视频流(websocket的流文件)

前言: 之前分享的有 rtmp直播流 ,flv直播流的一些方法,这里分享下,播放 websocket的直流的方法,使用的方法是JSMpeg,JSMpeg是JS写的视频、音频解码器,能使用WebGL&Canvas2D渲染以及WebAudio声音输出。 相关资料: 1、官网入口 2、github 3、官方例子 4、gitee案例 实现效果: 暂无图片 遇到问题: 封装成组件,做视频的墙的效果,但是一页放9个以后,第一个视频会崩溃,查了资料以后,目前暂...

浩星 8万+

基于HTTP协议的几种实时数据获取技术

原文链接https://www.cnblogs.com/xrq730/p/9280404.html,作者博客园----五月的仓颉,转载请注明出处,谢谢   HTTP协议 HTTP协议大家都很熟悉了,开始本文之前,首先简单回顾一下HTTP协议。 HTTP协议是建立在TCP协议上的应用层协议,协议的本质是请求----应答: 即对于HTTP协议来说,服务端给一次响应后整个请求就结束了,这是...

weixin_34407348的博客 736

通过Http协议从webservice中获取数据

通过Http协议从webservice中获取服务 步骤: 1. 当需要从webservice中获取某中服务的时候,首先要搞清楚服务提供方给出的要求 2. 根据webservice中的说明编写相应的代码 示例 1. 服务URL :http://www.webxml.com.cn/WebServices/WeatherWebService.asmx 2. getWeatherbyCityn

张超的博客 4108

videojs如何获取请求消息_基于 HTTP 协议的 3 种实时数据获取技术

HTTP协议方式一:短轮询方式二:长轮询方式三:WebSocketHTTP协议HTTP协议大家都很熟悉了,开始本文之前,首先简单回顾一下HTTP协议。HTTP协议是建立在TCP协议上的应用层协议,协议的本质是请求----应答:即对于HTTP协议来说,服务端给一次响应后整个请求就结束了,这是HTTP请求最大的特点,也是由于这个特点,HTTP请求无法做到的是服务端向客户端主动推送数据。但由于HTTP协...

weixin_39928768的博客 328

3步实现Java WebSocket推送:实时数据流 vs 传统HTTP轮询?

摘要: 本文通过对比HTTP轮询与WebSocket的实时通信差异,以Spring Boot为例,用3步实现Java版WebSocket全双工通信: 协议层:解析WebSocket握手机制,对比HTTP单向请求的局限性; 实战层:通过@EnableWebSocket注解和TextWebSocketHandler快速搭建服务端,配套JavaScript客户端示例; 优化层:剖析工业级部署要点,包括跨域处理、消息序列化和连接监控。 核心价值: 消除传统轮询的资源浪费,实现毫秒级延迟推送 Spring Boot开

java专栏 1014

HTTP3(HTTP Over QUIC)和Websocket-ACM技术组周会

出自neuq-acm技术部后端组(yh,wyx,wtl) 一.HTTP 3.0 1.概述 当IETF正式标准化HTTP/2时,Google正在独立构建一个新的传输协议,名为gQUIC。它后来成为新互联网草案,并被命名为QUIC。gQUIC最初的实验证明,在网络条件较差的情况下,gQUIC在增强网页浏览体验方面的效果非常好。因此,gQUIC的发展势头越来越好,IETF的大多数成员赞成建立一个在QUIC上运行的HTTP新规范。这个新的倡议被称为HTTP/3,以区别于当前的HTTP/2标准。 HTTP3.

Henrik-Yao的博客 5042

.net websocket 获取http登录的用户_基于 HTTP 协议的 3 种实时数据获取技术

HTTP协议方式一:短轮询方式二:长轮询方式三:WebSocket《Netty 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spring Boot 实现原理与源码解析 —— 精品合集》《数据库实体设计合集》《Java 面试题 —— 精品合集...

weixin_39910523的博客 296

Ubuntu系统下主板GPU温控pwm风扇

在Linux系统下——以Ubuntu为例,配置主板sys_fan等接口连接pwm温控风扇转速根据NVIDIA GPU温度,为服务器GPU等无主动散热显卡提供散热。

罗思哲的博客 5034

HTTP协议演进之路:从1.0到3.0的技术革命

本文系统梳理了HTTP协议从1.0到3.0的技术演进历程。HTTP/1.0奠定基础但性能低下,1.1引入持久连接仍存在队头阻塞问题,2.0通过二进制分帧和多路复用实现重大突破。HTTP/3则通过QUIC协议彻底重构传输层,基于UDP实现可靠传输,解决了TCP层队头阻塞,显著降低延迟并提升移动网络适应性。文章详细分析了各版本特性、优缺点及适用场景,指出HTTP/3在性能优化上的革命性突破,并探讨了其部署现状与未来发展方向,为开发者提供了协议选择策略建议。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 3438

xilinx vivado 设置多核多线程加快综合、布局布线、仿真速度的方法

加快vivado布局布线速度的多核编译方法 在tcl中执行下面的语句 set param general.maxThreads n来设置,n是你的CPU线程数。 在设置之后你可以通过get_param general.maxThreads 指令来确认是否成功设置, 加快vivado综合速度的多核编译方法 操作方法与上面加快布局布线的方法一样。 实际发现效果并不是很明显,官方论坛中提到只有在LINUX上才能发挥8核以上的效能,而且8核以上的效能提升并不明显。 加快vivado仿真.

shawn的FPGA圈 2万+

LSTM模型股价波动率预测(含Python代码)

源代码文件可在gzh’finance褪黑素'回复【24012203】获取。

celiaweiwei的博客 3776

网络传输协议之:Http1、Http2、Http3

一、什么是HTTP? HTTP(HyperText Transfer Protocol),是超文本传输协议,是目前互联网上要用最广泛的一种网络协议,所有的 WWW文件都必须遵守该标准。HTTP又使用了可靠的数据传输协议TCP协议,不会产生数据丢失和损坏。(HTTP协议属于应用层协议) HTTP的工作流程 浏览器与服务器建立TCP连接,即三次握手 TCP连接成功,浏览器发出HTTP请求命令 服务端接收请求并返回HTTP响应 服务器关闭连接,即四次挥手 浏览器解析请求的资源 connection:

qq_45923489的博客 1万+

什么是论文的创新点?公式化描述算是创新点吗?

写科研论文时,挑战之一就是如何让你的工作“脱颖而出”,也就是要有创新性。不管实验多么精确、推导多么复杂,若没有真正的创新,论文很可能会被拒。关于如何创新问题上,我最近在看刘雪峰老师的《科技论文写作指南》,看到了很多关于写作的新论述,在这里和大家进行分享。

加百力 的技术博客 1926

【HTTP 协议】掌握 Web 的核心技术

谈起 HTTP 协议(超文本传输协议),不知道大家第一次是从什么地方了解到这个协议的呢?在真实的网络环境中网络协议的种类非常多,其中有一些耳熟能详的协议,网络层的 IP 协议,传输层的 TCP, UDP 协议, 以及应用层的 HTTP/HTTPS. 站在 webapp(网站)的开发角度接触到的最多的就是 HTTP 协议,HTTP 究竟是一个什么样的协议呢,一起来看看叭~

保护小周ღ的博客 7667

H5 获取手机GPS坐标

只要手机有GPS模块,可以用HTML5的Geolocation接口获取 在HTML5中,geolocation作为navigator的一个属性出现,它本身是一个对象,拥有三个方法: getCurrentPosition watchPosition clearWatch 1.简单 function getLocation(){ if(navigator.geolocation){ //判断是否有这个对象 navigator.geoloc

达拉崩巴斑得贝迪卜多比鲁翁_ 4669

cuMotion 入门教程(一)面向机器人学的GPU加速运动生成技术

NVIDIA cuMotion是一款高性能机器人运动生成库,专注于机械操作任务,利用GPU加速技术提升性能。开发者预览版支持运动学/逆运动学、碰撞感知路径规划、轨迹优化等功能,兼容任意自由度机器人。该库提供C++和Python接口,支持从URDF/XRDF文件加载机器人模型,包含世界建模、碰撞检测等工具。教程详细介绍了安装配置、机器人描述加载、运动学计算、世界建模、逆运动学求解以及轨迹优化等核心功能。cuMotion整合了Lula和cuRobo库的技术优势,将成为Isaac ROS的核心组件,适用于工业机器

2506_90492529的博客 2198

HTTP协议深度解析与实现:从请求响应到HTTP/3的完整指南

本文基于多年Python实战经验,深度解析HTTP协议从基础到高级的全栈技术体系。内容涵盖请求/响应模型状态管理机制HTTP/2多路复用HTTP/3 QUIC协议等核心技术,通过架构流程图和完整代码案例,展示如何从零实现高性能HTTP服务器。文章包含协议演进分析、性能优化技巧和企业级实战案例,为开发者提供从理论到实践的完整HTTP协议解决方案。

七夜zippoe的博客 2263

Codex入门24-效率倍增秘籍(终极总结:10个让你开发速度翻倍的Codex高级技巧)

专栏收官之作!经过前23篇的系统学习,你已经掌握了 Codex CLI 的核心用法。本文浓缩10个实战验证的高级技巧:管道化提示词将复杂任务拆成递进指令链,模板化 SKILL.md 打造个人技能库,Shell 别名让操作快如闪电,多模型切换省钱又高效……这不是理论课,每个技巧都配有可直接运行的代码。掌握全部10招,构建你的 AI 开发工作流闭环,让开发速度真正翻倍!

yueyeguzhuo的专栏 190

科普文:详解HTTP3.0协议和QUIC协议

在 QUIC发布之前,HTTP 使用 TCP 作为传输数据的底层协议。随着移动互联网的不断发展,人们对实时交互和多样化网络场景的需求越来越大。然而,已经使用了40多年的传统TCP协议,在目前大规模远距离、移动网络差、网络切换频繁的背景下,存在着先天的性能瓶颈。其实QUIC并不是一个新的协议,2012 年,Google 就设计出了QUIC协议,在浏览器以及服务器端服务上部署并实现。2021 年 5 月, IETF在RFC 9000中对 QUIC 进行了标准化。

为无为,事无事,味无味。 4338

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

UFAST车道线检测 Ultra-Fast-Lane-Detection 从环境搭建到复现完成(一)

m0_46364958的博客 4345

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

MQTT 协议与 HTTP 协议的区别

在现代的网络通信中,MQTT 协议和 HTTP 协议都扮演着重要的角色,但它们有着不同的特点和适用场景。下面我们就从多个方面来详细探讨它们之间的区别。

lin85253788的博客 3218

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

HTTP 协议的发展历程及技术演进

HTTP协议自1989年由蒂姆·伯纳斯-李提出以来,经历了多个版本的演进。最初的HTTP/0.9仅支持简单的GET请求,无状态码和头部信息。HTTP/1.0引入了状态码、头部和多种内容类型,但仍存在每次请求需新建TCP连接的问题。HTTP/1.1通过持久连接、管线化和分块传输编码等改进,显著提升了性能,并支持虚拟主机和更精细的缓存控制。HTTP/2则采用二进制分帧、多路复用和头部压缩等技术,进一步提高了传输效率,并支持服务器推送。尽管HTTP/2解决了应用层的队头阻塞,但传输层的队头阻塞问题在HTTP/3中

Bruce__taotao的博客 2067

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 如何在面试中介绍自己的项目经验,很重要!
下一篇: 链路追踪 SkyWalking 源码分析 —— Collector Jetty Server Manager
公众号-芋道源码
博客等级 码龄10年 1632粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值