长短连接,长短轮询

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

相关文章

Spring Boot 整合 MyBatis 连接数据库及常见问题

《SpringBoot整合MyBatis连接数据库及常见问题》MyBatis是一个优秀的持久层框架,支持定制化SQL、存储过程以及高级映射,下面详细介绍如何在SpringBoot项目中整合My... 目录一、基本配置1. 添加依赖2. 配置数据库连接二、项目结构三、核心组件实现(示例)1. 实体类2. Ma

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

Windows Server服务器上配置FileZilla后,FTP连接不上?

《WindowsServer服务器上配置FileZilla后,FTP连接不上?》WindowsServer服务器上配置FileZilla后,FTP连接错误和操作超时的问题,应该如何解决?首先,通过... 目录在Windohttp://www.chinasem.cnws防火墙开启的情况下,遇到的错误如下:无法与

IDEA连接达梦数据库的详细配置指南

《IDEA连接达梦数据库的详细配置指南》达梦数据库(DMDatabase)作为国产关系型数据库的代表,广泛应用于企业级系统开发,本文将详细介绍如何在IntelliJIDEA中配置并连接达梦数据库,助力... 目录准备工作1. 下载达梦JDBC驱动配置步骤1. 将驱动添加到IDEA2. 创建数据库连接连接参数

pycharm远程连接服务器运行pytorch的过程详解

《pycharm远程连接服务器运行pytorch的过程详解》:本文主要介绍在Linux环境下使用Anaconda管理不同版本的Python环境,并通过PyCharm远程连接服务器来运行PyTorc... 目录linux部署pytorch背景介绍Anaconda安装Linux安装pytorch虚拟环境安装cu

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

oracle如何连接登陆SYS账号

《oracle如何连接登陆SYS账号》在Navicat12中连接Oracle11g的SYS用户时,如果设置了新密码但连接失败,可能是因为需要以SYSDBA或SYSOPER角色连接,解决方法是确保在连接... 目录oracle连接登陆NmOtMSYS账号工具问题解决SYS用户总结oracle连接登陆SYS账号