首页 > 其他分享 >轮询、长轮询、长连接、websocket

轮询、长轮询、长连接、websocket

时间:2023-02-28 16:44:57浏览次数:37  
标签:Web websocket 服务器端 轮询 SSE 请求 连接 客户端

前言

Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的。但是在Web中,由于浏览器的限制,实现即时通讯需要借助一些方法。这种限制出现的主要原因是,一般的Web通信都是浏览器先发送请求到服务器,服务器再进行响应完成数据的现实更新。

实现Web端即时通讯的方法:实现即时通讯主要有四种方式,它们分别是轮询、长轮询(comet)、长连接(SSE)、WebSocket。它们大体可以分为两类,一种是在HTTP基础上实现的,包括短轮询、comet和SSE;另一种不是在HTTP基础上实现是,即WebSocket。下面分别介绍一下这四种轮询方式,以及它们各自的优缺点。

介绍

轮询

短轮询的基本思路就是浏览器每隔一段时间向浏览器发送http请求,服务器端在收到请求后,不论是否有数据更新,都直接进行响应。这种方式实现的即时通信,本质上还是浏览器发送请求,服务器接受请求的一个过程,通过让客户端不断的进行请求,使得客户端能够模拟实时地收到服务器端的数据的变化。

这种方式的优点是比较简单,易于理解,实现起来也没有什么技术难点。缺点是显而易见的,这种方式由于需要不断的建立http连接,严重浪费了服务器端和客户端的资源。尤其是在客户端,距离来说,如果有数量级想对比较大的人同时位于基于短轮询的应用中,那么每一个用户的客户端都会疯狂的向服务器端发送http请求,而且不会间断。人数越多,服务器端压力越大,这是很不合理的。

因此短轮询不适用于那些同时在线用户数量比较大,并且很注重性能的Web应用。

长轮询(comet)

当服务器收到客户端发来的请求后,服务器端不会直接进行响应,而是先将这个请求挂起,然后判断服务器端数据是否有更新。如果有更新,则进行响应,如果一直没有数据,则到达一定的时间限制(服务器端设置)才返回。 。 客户端JavaScript响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。

长轮询和短轮询比起来,明显减少了很多不必要的http请求次数,相比之下节约了资源。长轮询的缺点在于,连接挂起也会导致资源的浪费。

轮询与长轮询都是基于HTTP的,两者本身存在着缺陷:轮询需要更快的处理速度;长轮询则更要求处理并发的能力;两者都是“被动型服务器”的体现:服务器不会主动推送信息,而是在客户端发送ajax请求后进行返回的响应。而理想的模型是"在服务器端数据有了变化后,可以主动推送给客户端",这种"主动型"服务器是解决这类问题的很好的方案。Web Sockets就是这样的方案。

长连接(SSE)

SSE是HTML5新增的功能,全称为Server-Sent Events。它可以允许服务推送数据到客户端。SSE在本质上就与之前的长轮询、短轮询不同,虽然都是基于http协议的,但是轮询需要客户端先发送请求。而SSE最大的特点就是不需要客户端发送请求,可以实现只要服务器端数据有更新,就可以马上发送到客户端。

SSE的优势很明显,它不需要建立或保持大量的客户端发往服务器端的请求,节约了很多资源,提升应用性能。并且后面会介绍道,SSE的实现非常简单,并且不需要依赖其他插件。

WebSocket

WebSocketHtml5定义的一个新协议,与传统的http协议不同,该协议可以实现服务器与客户端之间全双工通信。简单来说,首先需要在客户端和服务器端建立起一个连接,这部分需要http。连接一旦建立,客户端和服务器端就处于平等的地位,可以相互发送数据,不存在请求和响应的区别。

WebSocket的优点是实现了双向通信,缺点是服务器端的逻辑非常复杂。现在针对不同的后台语言有不同的插件可以使用。

四种Web即时通信技术比较

从兼容性角度考虑,短轮询>长轮询>长连接SSE>WebSocket

从性能方面考虑,WebSocket>长连接SSE>长轮询>短轮询。

标签:Web,websocket,服务器端,轮询,SSE,请求,连接,客户端
From: https://www.cnblogs.com/hkwJsxl/p/17164954.html

相关文章

  • Oracle 低版本客户端连接19C报错ORA-28040
    #适用范围12.2+#问题概述客户使用Oracle11.2客户端连接Oracle19c的时候,报错:ORA-28040:NomatchingauthenticationprotocolORA-28040:没有匹配的验证协议#问题原......
  • 轮询
    https://blog.csdn.net/m0_48333563/article/details/125968144https://blog.csdn.net/u010263423/article/details/118408737?spm=1001.2101.3001.6661.1&utm_medium=dis......
  • 记一次druid 数据库连接池遇到 union或者union all语句时报错以及处理
    报错日志大概如下:##Errorupdatingdatabase.Cause:java.sql.SQLException:sqlinjectionviolation,syntaxerror:syntaxerror,errorin:'UNIONALL......
  • MySQL 内连接、外连接、全连接
    连接查询用于多表关联查询,连接方式不同,查询重点不同。内连接作用:查询多表之间交集部分数据关键词:innerjoin可简写为:join,即innerjoin=join图示:左外......
  • beeline连接远程hive数据库
    被要求用hive-e连接远程hive数据库,因为之前很少用hive这个命令,转而用beeline,可以用下列命令成功连接远程数据库。/opt/hive/bin/beeline-ujdbc:hive2://host:port/dat......
  • AWS Ubuntu22.04安装Mysql及配置远程连接
    一、升级apt资源包sudoaptupdate二、安装MySQLsudoaptinstallmysql-server三、启动MySQL服务sudoservicemysqlstart四、登录MySql查看MySql用户名/密码su......
  • 问题[] 远程连接腾讯云服务器上的mysql
    困扰我两个月的问题终于解决啦.问题: 腾讯云服务上的mariadb,在本地win7连不上数据库...用户授权.GRANTALL PRIVILEGESON*.* TO 'aaa'@'%' IDENTIFIEDBY......
  • Java连接数据库
    对于Java数据库操作,需要先导入JDBC相关的包,然后连接数据库。连接数据库有以下几个步骤:1.加载JDBC驱动类Class.forName("com.mysql.jdbc.Driver");2.创......
  • 使用默认pypi源出现连接超时
    背景信息安装dataworkssdk时报错,原因是连接默认的pypi仓库超时pipinstallaliyun-python-sdk-dataworks-public==4.2.1报错信息Retrying(Retry(total=4,conne......
  • USB从机主动断开连接
    目录在一些情况下,需要USB口的引脚复用成其他功能,比如说PB10、PB11要复用成定时器输出引脚;或者需要USB从机主动断开,类似某些杀毒软件带的“安全弹出”,不过杀毒软件操作的是......