HTML5 API

WebSocket

WebSocket 是 HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议。 相较于传统的轮询(polling)和Comet技术,HTML5 定义的 WebSocket 协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。

当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。

以下 API 用于创建 WebSocket 对象。

Websocket 使用 ws 或 wss 的统一资源标志符,类似于 HTTPS,其中 wss 表示在 TLS 之上的 Websocket。

比如:
ws://example.com/wsapi
wss://secure.example.com/

Websocket 使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。 默认情况下,Websocket 协议使用 80 端口;运行在 TLS 之上时,默认使用 443 端口。

具体实例代码看:Python3Demo/sanic_demo/下的websocket_demo.py和websocket_demo.html

为什么使用WebSocket协议能更节约服务器资源?

轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。
这种传统模式具有明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,
因此会浪费很多的带宽等服务器资源。

websocket 与 socket的区别

(了解即可,现在能用Websocket就不会选择这种方案了)

软件通信OSI参考模型(七层模型),从下到上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

其中,下三层结构偏向与数据通信,上三层更偏向于数据处理,中间的传输层则是连接上三层与下三层之间的桥梁,每一层都做不同的工作,上层协议依赖与下层协议。基于这个通信结构的概念。

Socket 其实并不是一个协议,是应用层与 TCP/IP协议族通信的中间软件抽象层,它是一组接口。 当两台主机通信时,让 Socket 去组织数据,以符合指定的协议。 TCP连接 则更依靠于底层的 IP协议,IP协议的连接 则依赖于 链路层等更低层次。

WebSocket 则是一个典型的应用层协议。

总的来说:Socket 是传输层协议,WebSocket 是应用层协议。

websocket出现之前的实现方案

客户端是主动方,服务端是被动方的传统Web模式。 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便,

如带有即时通信、实时数据、订阅推送等功能的应用。

在WebSocket规范提出之前,开发人员若要实现这些实时性较强的功能,经常会使用折衷的解决方法:

轮询(polling)和Comet技术其实后者本质上也是一种轮询,只不过有所改进。

  • 轮询是最原始的实现实时Web应用的解决方案。轮询技术要求客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动。明显地,这种方法会导致过多不必要的请求,浪费流量和服务器资源。【轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。】这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

  • Comet技术又可以分为长轮询流技术。长轮询改进了上述的轮询技术,减小了无用的请求。它会为某些数据设定过期时间,当数据过期后才会向服务端发送请求;这种机制适合数据的改动不是特别频繁的情况。流技术通常是指客户端使用一个隐藏的窗口与服务端建立一个HTTP长连接,服务端会不断更新连接状态以保持HTTP长连接存活;这样的话,服务端就可以通过这条长连接主动将数据发送给客户端;流技术在大并发环境下,可能会考验到服务端的性能。

这两种技术都是基于请求-应答模式,都不算是真正意义上的实时技术;它们的每一次请求、应答,都浪费了一定流量在相同的头部信息上,并且开发复杂度也较大。