美文网首页iOS随手分享
websocket和轮询的整理

websocket和轮询的整理

作者: Grit_1024 | 来源:发表于2020-12-19 18:25 被阅读0次

1.WebSocket的应用场景和特点:

1. 应用场景:

WebSocket是一种在单个TCP连接上进行全双工通信的协议, 是为了满足基于 Web 的日益增长的实时通信需求而产生的。我们平时接触的大多数是HTTP的接口,但是在有些业务场景中满足不了我们的需求,这时候就需要用到WebSocket。

2.简单举两个例子:
(1) 页面地图上要实时显示在线人员坐标:

传统基于HTTP接口的处理方式是轮询,每次轮询更新最新的坐标信息。

(2)手机的付款码页面,在外界设备扫描付款码支付成功后,手机付款码页面提示“支付成功”并自动关闭:

传统方式还是轮询,付款码页面一直调用接口,直到从服务器获取成功支付的状态后,手机提示“支付成功”并关闭付款码页面。

HTTP 协议有一个缺陷:通信只能由客户端发起。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。

我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。但这种方式即浪费带宽(HTTP HEAD 是比较大的),又消耗服务器 CPU 占用(没有信息也要接受请求)。在WebSocket API尚未被众多浏览器实现和发布的时期,开发者在开发需要接收来自服务器的实时通知应用程序时,不得不求助于一些“hacks”来模拟实时连接以实现实时通信,最流行的一种方式是长轮询 。 长轮询主要是发出一个HTTP请求到服务器,然后保持连接打开以允许服务器在稍后的时间响应(由服务器确定)。为了这个连接有效地工作,许多技术需要被用于确保消息不错过,如需要在服务器端缓存和记录多个的连接信息(每个客户)。虽然长轮询是可以解决这一问题的,但它会耗费更多的资源,如CPU、内存和带宽等,要想很好的解决实时通信问题就需要设计和发布一种新的协议

1.2. WebSocket定义:

WebSocket是一种协议,是一种与HTTP 同等的网络协议,两者都是应用层协议,都基于 TCP 协议。但是 WebSocket 是一种双向通信协议,在建立连接之后,WebSocket 的 server 与 client 都能主动向对方发送或接收数据。同时,WebSocket在建立连接时需要借助 HTTP 协议,连接建立好了之后 client 与 server 之间的双向通信就与 HTTP 无关了。相比于传统HTTP 的每次“请求-应答”都要client 与 server 建立连接的模式,WebSocket 是一种长连接的模式。就是一旦WebSocket 连接建立后,除非client 或者 server 中有一端主动断开连接,否则每次数据传输之前都不需要HTTP 那样请求数据。WebSocket 对象提供了一组 API,用于创建和管理 WebSocket 连接,以及通过连接发送和接收数据。浏览器提供的WebSocket API很简洁,调用示例如下:

var ws = new WebSocket('wss://example.com/socket'); // 创建安全WebSocket 连接(wss)
ws.onerror = function (error) { ... } // 错误处理
ws.onclose = function () { ... } // 关闭时调用
ws.onopen = function () { ws.send("Connection established. Hello server!");} // 连接建立时调用向服务端发送消息
ws.onmessage = function(msg) {  ... }// 接收服务端发送的消息

HTTP、WebSocket 等应用层协议,都是基于 TCP 协议来传输数据的。我们可以把这些高级协议理解成对 TCP 的封装。既然大家都使用 TCP 协议,那么大家的连接和断开,都要遵循 TCP 协议中的三次握手和四次握手 ,只是在连接之后发送的内容不同,或者是断开的时间不同。对于 WebSocket 来说,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

2.轮询是什么?

在客户端定义一个定时器,定时的向服务器发起请求获取最新的数据

3.轮询和websocket的区别:

  1. 轮询是传统的方式,不存在浏览器兼容性问题,定时的发送网络请求
  2. 轮询对客户端的电脑资源会造成额外的开销,如果页面中的定时器过多时不能实时获取最新的数据,获取数据会有延迟
  3. websocket他对浏览器的版本有要求,低版本的浏览器不一定能用
  4. websocket可以实时获取最新的数据,不会产生额外的开销。服务器有新的数据之后,会主动推送给客户端
  5. 轮询是定时的发送ajax请求,获取服务器的数据
  6. 在现阶段如果可以,建议使用websocket

4.长轮询的利与弊:

优点

  • 长轮询是在 XMLHttpRequest 之后实现的,它几乎得到了设备的普遍支持,因此通常很少需要有进一步的备选方案。但是,在必须处理异常的情况下,或者在服务器可查询新数据但不支持长轮询(更不用说其他更现代的技术标准)的情况下,基本轮询有时仍然有些用处,并且可以使用 XMLHttpRequest 或通过 JSONP 利用简单的 HTML 脚本标签。

缺点

  • 长轮询大量占据服务器资源。
  • 可靠的消息排序 可能是长轮询的一个问题,因为来自同一个客户端的多个 HTTP 请求可能同时运行。举个例子,如果一个客户端打开两个浏览器选项卡,使用相同的服务器资源,并且客户端应用程序正在将数据持久化到本地存储区(如 localStorage 或 IndexedDb),则无法保证重复数据不会被多次写入。
  • 根据服务端实现的不同,一个客户端对消息的确认接收也可能导致另一个客户端根本不会收到预期的消息,因为服务端可能错误地认为客户端已经收到了它所期望的数据。

5.WebSockets 的利与弊

优点

  • WebSockets 保持一个唯一的连接打开,同时消除长轮询的延迟问题。
  • WebSockets 通常不使用 XMLHttpRequest,因此,当我们每次需要从服务器获取更多的信息时,无需发送头部数据。反过来说,这又减少了数据发送到服务器时需要付出的高昂的数据负载代价。

缺点

  • 当连接终止时,WebSockets 无法自动恢复连接 —— 这是需要你自己实现的部分,也是导致存在许多 客户端库 的原因。
  • 早于 2011 年的浏览器无法支持 WebSocket 连接 —— 但这一点越来越无关紧要。

6. 为什么 WebSocket 协议是更好的选择?

一般来说,WebSockets 会是更好的选择。

长轮询在服务器上占用更多的资源,而 WebSockets 在服务器上占用的空间很少。长轮询还需要在服务器与许多设备之间进行多次通信。而不同的网关对于一个常规连接允许保持打开的时间有不同的标准。如果连接打开时间太久,其进程可能会被杀死,甚至当这个进程正在处理一些重要的事情时。

使用 WebSockets 构建应用的理由:

  • 全双工异步消息传送。换句话说,客户端和服务器都可以独立地相互传输消息。
  • WebSockets 无需任何配置即可通过大多数防火墙。
  • 良好的安全模式(基于原始的安全模式)。

7. 面试时常见的问法

  • 在项目中如果实时的获取服务器最新的数据?
  • 如何统计当前的实时在线人数?
  • 如何实现一个聊天室?

摘自掘金 :
作者:MadPecker
文章:《WebSocket,不再“轮询”?》
链接:https://juejin.cn/post/6844903860234895373
作者:江不知
链接:https://juejin.cn/post/6844903871710494733
文章:《[译] WebSockets 与长轮询的较量》

相关文章

网友评论

    本文标题:websocket和轮询的整理

    本文链接:https://www.haomeiwen.com/subject/vsycnktx.html