长短连接,长短轮询

长短连接


常见的网上说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 定时向后端发送请求

  1. 优点:实现简单
  2. 缺点:数据同步不及时,增加后端处理压力
  3. 场景:适用于对消息及时性要求不高且服务器资源充足的开发
//前端    
setInterval(function() {
  $.ajax({
    url: 'https://www.baidu.com/',
    success: function() {
      //success code
    }
  });
}, 3000);       //每隔固定时间请求一次


//服务端    
public ActionResult NoLongPolling(){
    return Content(DateTime.Now.ToString());      //请求即响应
}

 

长轮询

在 Ajax 轮询的基础上做的改进,后端数据没有更新时不返回数据,保存连接;直到后端有数据变化,则响应请求并关闭连接。前端收到数据后,再次向后端发起请求

  1. 优点:通信及时,服务端资源消耗低
  2. 缺点:请求交替时消息会延迟
  3. 场景:扫码登录
//前端
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短轮询、长轮询

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值