加载中...
WebSocket
发表于:2023-09-18 | 分类: 网络

什么是 websocket?

websocket 是一种网络传输协议,它和 http 一样,都位于 OSI 模型的应用层。且都依赖于 TCP 协议。但是他的协议是 ws 或 wss。

功能?

websocket 协议支持浏览器于 web 服务器之间的双向通信

在 websocket 协议出现之前,网站中都是通过长轮询 或者 长连接 之类的来实现 Comet这种 web 推送,使得服务器能够主动的、实时的将消息推送给客户端。

长轮询

在 http 中,每一个 request 对应一个 response。response 是被动的,服务器是无法主动向客户端推送信息。但是在一些实时性较高的需求中,这是无法满足需求的。因此,可以每隔一段时间就主动的向服务请求,以获取最新的数据。这个保持连接的过程就是长轮询。

通常,我们可以这样实现:

const loadData = () => {
  fetch("http://someapi/test")
    .then(function (response) {
      return response.json();
    })
    .then(function (myJson) {
      console.log(myJson);
      setTimeout(loadData, 1000);
    });
};

长连接

long poll 其实原理跟 ajax 轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直保持连接),也就是说,客户端发起连接后,如果没消息,就一直不返回 Response 给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始

在页面里嵌入一个隐蔵 iframe,将这个隐蔵 iframe 的 src 属性设为对一个长连接的请求或是采用 xhr 请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销。

为什么需要使用 websocket

从上面的例子来看都非常的消耗资源,且都有一个特点,也就是 http 协议的特点:被动性

长轮询: 它的主要逻辑都是不断的在建立 http 连接,然后等待服务器处理
长连接(long poll): 需要有很高的并发。所以 ajax 轮询 和 long poll 都有可能发生这种情况。

而 websocket,当服务器建立 websocket 协议时,只需要经历一次 HTTP 请求,就可以做到远远不断的信息传送,也就是在有信息的情况下才会主动的通知,而不是像 http 一样,每次都是需要客户端来询问(发起请求)。

这样,就解决的以上的消息延时的问题以及非常消耗资源的情况。

上一篇:
TCP原理
下一篇:
cookie详解
本文目录
本文目录