本文主要是介绍长短连接,长短轮询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
长短连接
常见的网上说http分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说法。HTPP协议是应用层协议,而TCP是传输层协议,只有负责传输的这一层才需要建立连接。
短连接
所谓短连接,即连接只保持在数据传输过程,请求发起,连接建立,数据返回,连接关闭。它适用于一些实时数据请求,配合轮询来进行新旧数据的更替。短连接的流程就是:建立连接->发送数据->断开连接。一次发送之后立即断开连接。
长连接
HTTP1.0(可以设置头文件Keep-Alive,Connection)、HTTP1.0(默认长连接)、HTTP2.0(管道式连接)
所谓长连接,即连接建立后,在请求关闭连接前客户端与服务端一直保持连接,实质是保持这个通信管道,之后便可以对其进行复用。例如一个页面有很多文件,JS文件,CSS文件等等,不能每次都要建立一次连接,所以长连接是比较好的解决办法。
需要注意的是长连接并不是永久连接的。如果一段时间内(header内可设置超时时间),这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉。即 长时间没有响应,超时会自动断开。
它适用于涉及消息推送,请求频繁的场景(直播,流媒体)。连接建立后,在该连接下的所有请求都可以重用这个长连接管道,避免了频繁了连接请求,提升了效率。
长短连接的示图
长短轮询
所谓轮询,即是在一个循环周期内不断发起请求来得到数据的机制。只要有请求的地方,都可以实现轮询
1.概念
轮询:客户端定时去请求服务端,每一次请求都立即返回结果,根据新旧数据对比决定是否使用这个结果。可以理解为客户端主动请求来促使数据更新
长轮询:客户端请求服务端,但是服务端并不是即时返回,这个过程服务器挂起;只有当内容更新时才返回内容给客户端。客户端接收并处理数据后再进行下一次请求。从流程上讲,可以理解为服务器向客户端推送内容;
2.具体实现
轮询:前端使用定时器,每间隔一段时间发送请求来获取数据是否更新,这种方式可兼容ie和支持高级浏览器。通常采用 setInterval 或者 setTimeout 实现。
通过递归的方式,每隔一定时间再次发送请求,这样虽然无法保证两次请求间隔为指定时间,但是获取的数据顺序得到保证。
长轮询
客户端像传统轮询一样从服务端请求数据,服务端挂起不会立刻返回,直到有数据或超时才返回给客户端,然后关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
长轮询解决了频繁的网络请求浪费服务器,资源可以及时返回给浏览器。
3.代码比较
轮询:
利用 Ajax,通过 setInterval 定时向后端发送请求
- 优点:实现简单
- 缺点:数据同步不及时,增加后端处理压力
- 场景:适用于对消息及时性要求不高且服务器资源充足的开发
//前端
setInterval(function() {$.ajax({url: 'https://www.baidu.com/',success: function() {//success code}});
}, 3000); //每隔固定时间请求一次//服务端
public ActionResult NoLongPolling(){return Content(DateTime.Now.ToString()); //请求即响应
}
长轮询
在 Ajax 轮询的基础上做的改进,后端数据没有更新时不返回数据,保存连接;直到后端有数据变化,则响应请求并关闭连接。前端收到数据后,再次向后端发起请求
- 优点:通信及时,服务端资源消耗低
- 缺点:请求交替时消息会延迟
- 场景:扫码登录
//前端
function async () {$.ajax({url: 'http://www.baidu.com/',success: function() {async (); 收到服务器响应后再请求//code from here} });
}//服务端
public ActionResult LongPolling() {while (true) {Thread.Sleep(1000); // 模拟挂起的操作,return Content(DateTime.Now.ToString()); //服务器每秒会有更新,然后返回给客户端实时数据}
}
4.两者的特点比较
轮询:
- 特点:每隔固定时间请求服务器一次
- 缺点
- 大量耗费服务器资源和宽带资源
- 因为客户端按固定频率请求服务器,很多时候 并没有新的数据更新,因此绝大部分请求都是无效请求,浪费服务器资源。
- 数据不一定是实时更新,基本会有延迟。
- setTimeout 在等到每次 EventLoop 时,都要判断是否到指定时间,直到时间到再执行函数,一旦遇到页面有大量任务或者返回时间特别耗时,数据返回就会有延迟(页面“假死”)
- 大量耗费服务器资源和宽带资源
- 优点:编写简单
长轮询
- 特点:只有收到服务器端响应响应后,再发出请求
- 优点:
- 在无消息的情况下(数据没有更新)不会频繁的请求
- 数据实时更新
- 缺点
- 服务器挂起(保持连接)会消耗资源
长短轮询和长短连接的区别
一个TCP连接是否是长短连接,是通过HTTP的header中设置Connection来决定的。即通过协议规定实现
一个HTTP请求是否是长短轮询,是通过前后端的处理方式决定的,前端是否设置时间间隔请求,后端是否设置挂起请求。即通过编程方式实现
关于服务器挂起
服务器挂起:数据库因为缺少某种资源而阻止服务器响应服务请求。这种服务请求被称为服务器挂起。
服务器挂起不会表现为服务器崩溃,但服务器挂起之后可能会崩溃。例如,由于故障(死锁)或者大量请求的缘故,可能没有任何可用的执行线程来完成工作,所有执行线程都被占用或忙于处理以前的请求。
在出现以下情况时服务器会挂起:
1.服务器不响应新的请求。
2.请求超时。
3.请求处理的时间越来越长。
参考:轮询与长轮询
服务端推送通信技术及其优劣势
TCP长连接,短连接,HTTP短轮询、长轮询
这篇关于长短连接,长短轮询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!