什么是轮询、长轮询、长连接一篇文章让你不在懵懂 – 第412篇

相关历史文章(阅读本文前,您可能需要先看下之前的系列 )

国内最全的Spring Boot系列之四

享元模式:共享女友 – 第355篇

Spring Boot @ConditionalOnClass上的注解你了解多少-java元注解和注解 – 第404篇

SpringBoot 使用validation数据校验-超级详细超级多干货 – 第406篇

SpringBoot 使用validation数据校验之分组校验怎么玩?·分组还有这么多讲究 – 第408篇

SpringBoot 使用validation数据校验之自定义校验注解·源码分析+实例 – 第410篇

SpringBoot 使用validation数据校验之国际化问题怎么搞?满满的干货,值得收藏 – 第411篇

什么是轮询、长轮询、长连接一篇文章让你不在懵懂 – 第412篇

悟纤:师傅,最近产品给我搞了一个头疼的需求。

师傅:徒儿,这是碰到了啥蛋疼的需求了?跟为师说说呗。

悟纤:有师傅真好,师傅真的是我的宝。

​ 师傅:马屁就不要拍了,还是赶紧说问题吧。

悟纤:需求就是有两个角色,面试官和面试者,面试者在面试页面可以时时收到面试官的信息?有点类似聊天时时信息。

师傅:这个需求,就有点的说了,这还得从三百年前说起,话说…

长轮询系列:

(1)✅《什么是轮询、长轮询、长连接一篇文章让你不在懵懂》

(2)《Spring Boot使用Servlet居然也可以实现长轮询》

(3)「待定」《Spring Boot使用DeferredResult实现长轮询》

(4)「待拟定」…

这一节我们先来看看《什么是轮询、长轮询、长连接一篇文章让你不在懵懂》。

前言

在网页中要保证消息的及时推送,那么不得不说一说轮询和长连接了。

通常的web应用的交互过程是:客户端发送请求,服务端接收和审核完成请求后进行处理并返回结果给客户端,然后客户端将信息呈现出来。

这种机制在处理一些简单信息传递,不频繁的应用中比较常用。但对于一些实时传递要求比较高的应用来说,比如在线游戏,在线证券,在线聊天,在线新闻播报等应用来说就显得力不从心,一来要处理实时信息,二来要在极短的时间内处理大量的数据。

在webSocket之前,技术人员常采用的方法就是轮询(polling)和comet技术。comet技术就是轮询技术的改进,分为长轮询和流技术。

一、长短连接

1.1 短连接

客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。

1.2 长连接

客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

悟纤有话说:

(1)长连接是指的TCP连接,而不是HTTP连接;

(2)长连接意味着连接会被复用;

(3)服务器和客户端都设置 Connection: keep-alive

(4)HTTP1.1默认长连接

1.2.1 好处

比如请求一个普通的网页,这个网页里肯定包含了若干CSS、JS等一系列资源,如果是短连接(也就是每次都要重新建立TCP连接)的话,那每次打开一个网页,基本就要建立几个甚至几十个TCP连接,浪费很多网络资源。如果是长连接的话,那么这么多HTTP请求(包括请求网页的内容、CSS文件、JS文件、图片等)都是使用的一个TCP连接,显然可以节省很多资源。

另外一点,长连接并不是永久连接的。如果一段时间内(具体时间可以在header中进行设置,也就是所谓的超时时间),这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉。

二、轮询

什么是轮询?我擦,这个该怎么解释呢。

举个栗子,在火车上想上洗手间,挤到洗手间旁,却发现洗手间有人,于是你只能回座位继续等。过了5分钟,又朝洗手间的方向挤过去,却发现洗手间还是有人,又只能回坐等。这么一而再,再而三的每隔5分钟去洗手间查看洗手间是否有蹲位,这就是轮询。

2.1 短轮询

轮询的原理就是客户端以一定的时间间隔向服务端发出请求,频繁的请求保持客户端和服务端同步。

这个技术最大的问题就是客户端发出请求和服务器端的更新并不是一致的。客户端以固定的频率想服务器发出请求,可能服务器端并没有更新,返回的是个空的信息,等服务器端更新的时候,有可能客户端并没有请求,而且只有最后一次请求才能获得最新数据,这样多次请求不仅浪费了资源,而且并不是实际上的实时更新。

2.1.1 简单理解

浏览器定时向服务器发送请求,看有没有更新的数据。(重复发送Http请求,查询目标事件是否完成,优点:编写简单,缺点:浪费带宽和服务器资源)

2.1.2 Jquery实现说明

客户端使用window.setInterval()定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。

2.1.3 优缺点

优点:后端程序编写比较容易(后端基本不用动)。

缺点:请求中有大半是无用,浪费带宽和服务器资源。(而每一次的 HTTP 请求和应答都带有完整的 HTTP 头信息,这就增加了每次传输的数据量)

2.1.4 实例

适于小型应用。

2.2 长轮询

页面发起一个到服务器的请求,然后服务器一直保持连接打开,直到有数据可以发送。

发送完数据之后,浏览器关闭连接,随即又发送一个到服务器的新请求。这一过程在页面打开期间一直持续不断。(在服务端hold住Http请求(死循环或者sleep等等方式),等到目标时间发生,返回Http响应。

2.2.1 Jquery实现说明

客户端使用window.setInterval()定时向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接(或到了设定的超时时间关闭连接),客户端处理完响应信息后再向服务器发送新的请求。

在长轮询这里的定时时间会比较长,比如30秒一次。

2.2.2 优缺点

优点:在无消息的情况下不会频繁的请求,节省了网络流量,解决了服务端一直疲于接受请求的窘境。

缺点:服务器hold连接会消耗资源,需要同时维护多个线程,服务器所能承载的TCP连接数是有上限的,这种轮询很容易把连接数顶满。

2.2.2 实例

实例:WebQQ、Hi网页版、Facebook IM。

最后的最后要注意:

长轮询和轮询是对于是否hold住连接等待来说的。

而长连接和短连接是对于tcp连接是否维持来说的。

这一节先介绍到这里,都是些概念性的东西,之后的规划,主要是针对长轮询的一些实现方案进行实战。

发表回复

相关推荐

海參補什麼 – 海參的營養價值和功效

海參它是一種管狀的海洋生物,大多數海參類似於大型蠕蟲或毛蟲,身體柔軟,呈管狀。它們由潛水員收集或在大型人工池塘中進行...

· 4秒前

如何分辨海南黃花梨的真假?

結合我的經驗,這裡詳細講一下鑒別海黃的這六大關鍵點。①紋路黃花梨主要玩的就是絢麗多彩的紋路,像瘤疤紋,芝麻點紋,鬼臉紋...

· 1分钟前

射精痛?精囊炎?瞭解一下

1.什麼是精囊炎? 精囊炎是由大腸桿菌等引起鄰近器官前列腺等有感染或任何情況下導致前列腺、精囊充血時,細菌侵及精囊,...

· 2分钟前

詞根 ‘META’ 和 ‘PER’

公眾號同名,每日打卡~DAY 103詞根178:META 表示“背後的,超過”① +data(數據)= metadata② +phor(帶來)+al(形容詞後綴)...

· 2分钟前

隻需7步,教你選到好貓糧!

現在養貓的人越來越多瞭,而給貓咪喂食也被鏟屎官們認為是頭等大事。那麼給貓咪喂什麼貓糧更營養健康呢?隻需7步,教你選到好...

· 6分钟前