长短连接,长短轮询

2023-11-23 17:30
文章标签 连接 轮询 长短

本文主要是介绍长短连接,长短轮询,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

长短连接


常见的网上说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短轮询、长轮询

 

 

这篇关于长短连接,长短轮询的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/419581

相关文章

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

Java 连接Sql sever 2008

Java 连接Sql sever 2008 /Sql sever 2008 R2 import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC

【即时通讯】轮询方式实现

技术栈 LayUI、jQuery实现前端效果。django4.2、django-ninja实现后端接口。 代码仓 - 后端 代码仓 - 前端 实现功能 首次访问页面并发送消息时需要设置昵称发送内容为空时要提示用户不能发送空消息前端定时获取消息,然后展示在页面上。 效果展示 首次发送需要设置昵称 发送消息与消息展示 提示用户不能发送空消息 后端接口 发送消息 DB = []@ro

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

nginx长连接的问题

转自: http://www.360doc.com/content/12/1108/17/1073512_246644318.shtml

NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64

转自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=190176&id=4234854 一 前言 当管理大量连接时,特别是只有少量活跃连接,NGINX有比较好的CPU和RAM利用率,如今是多终端保持在线的时代,更能让NGINX发挥这个优点。本文做一个简单测试,NGINX在一个普通PC虚拟机上维护100k的HTTP

TL-Tomcat中长连接的底层源码原理实现

长连接:浏览器告诉tomcat不要将请求关掉。  如果不是长连接,tomcat响应后会告诉浏览器把这个连接关掉。    tomcat中有一个缓冲区  如果发送大批量数据后 又不处理  那么会堆积缓冲区 后面的请求会越来越慢。

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed

DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed 文章目录 DBeaver 连接 MySQL 报错 Public Key Retrieval is not allowed问题解决办法 问题 使用 DBeaver 连接 MySQL 数据库的时候, 一直报错下面的错误 Public Key Retrieval is

Github连接方式

打开Linux中git的配置文件: /home/username/git/MyRepository/.git/config [core]repositoryformatversion = 0filemode = truebare = falselogallrefupdates = true[remote "origin"]fetch = +refs/heads/*:refs/remot