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长连接存活;这样的话,服务端就可以通过这条长连接主动将数据发送给客户端;流技术在大并发环境下,可能会考验到服务端的性能。
这两种技术都是基于请求-应答模式,都不算是真正意义上的实时技术;它们的每一次请求、应答,都浪费了一定流量在相同的头部信息上,并且开发复杂度也较大。