WebSockets - 双向通信



在深入探讨 WebSockets 的需求之前,有必要了解一下现有的用于服务器和客户端之间双向通信的技术。它们如下所示:

  • 轮询
  • 长轮询
  • 流传输
  • 回发和 AJAX
  • HTML5

轮询

轮询可以定义为一种方法,无论传输中是否存在数据,它都会执行周期性请求。周期性请求以同步方式发送。客户端在指定的时间间隔内向服务器发送周期性请求。服务器的响应包含可用数据或某些警告消息。

长轮询

顾名思义,长轮询包含与轮询类似的技术。客户端和服务器保持连接活动,直到获取一些数据或发生超时。如果由于某些原因连接丢失,客户端可以重新开始并执行顺序请求。

长轮询只不过是对轮询过程的性能改进,但持续的请求可能会减慢进程。

流传输

它被认为是实时数据传输的最佳选择。服务器保持与客户端的连接打开并处于活动状态,直到获取所需数据为止。在这种情况下,连接被认为是无限期打开的。流传输包含 HTTP 头,这会增加文件大小,从而增加延迟。这可以被认为是一个主要缺点。

AJAX

AJAX 基于 JavaScript 的XmlHttpRequest 对象。它是异步 JavaScript 和 XML 的缩写形式。XmlHttpRequest 对象允许执行 JavaScript 而不重新加载整个网页。AJAX 只发送和接收网页的一部分。

使用XmlHttpRequest 对象的 AJAX 调用的代码片段如下所示:

var xhttp;

if (window.XMLHttpRequest) {
   xhttp = new XMLHttpRequest();
} else {
   // code for IE6, IE5
   xhttp = new ActiveXObject("Microsoft.XMLHTTP");
}

WebSockets相比,AJAX的主要缺点是:

  • 它们发送 HTTP 头,这使得总大小更大。
  • 通信是半双工的。
  • Web 服务器消耗更多资源。

HTML5

HTML5 是一个用于开发和设计 Web 应用程序的强大框架。其主要支柱包括标记、CSS3JavaScript API。

下图显示了 HTML5 组件:

HTML5

以下代码片段描述了 HTML5 及其文档类型的声明。

<!DOCTYPE html>

为什么我们需要 WebSockets?

互联网最初被设想为超文本标记语言 (HTML) 页面的集合,这些页面相互链接,形成一个概念上的信息网络。随着时间的推移,静态资源的数量增加,更丰富的项目(例如图像)也开始成为网络结构的一部分。

服务器技术发展使得动态服务器页面成为可能——其内容基于查询生成的页面。

很快,对更多动态网页的需求导致了动态超文本标记语言 (DHTML) 的出现。这都要感谢 JavaScript。在接下来的几年里,我们看到了跨框架通信,试图避免页面重新加载,然后是框架内的HTTP 轮询

但是,这些解决方案都没有提供真正标准化的跨浏览器解决方案,用于服务器和客户端之间的实时双向通信。

这就产生了对 WebSockets 协议的需求。它催生了全双工通信,将桌面丰富的功能带到了所有 Web 浏览器。

广告