http 有3个特性: 非持久链接(事务结束就关闭)、被动性(等着客户端请求)、无记忆状态(下次打开链接,不记得上次,得健忘症了,再链接还得再告诉服务器一遍)。ajax
在这种状况下出现了,Websocket出现了。
他解决了HTTP的这几个难题。
首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就能够主动推送信息给客户端啦。服务器
就变成了这样,只须要通过一次HTTP请求,就能够作到源源不断的信息传送了。(在程序设计中,这种设计叫作回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你)
这样的协议解决了上面同步有延迟,并且还很是消耗资源的这种状况。
那么为何他会解决服务器上消耗资源的问题呢?
其实咱们所用的程序是要通过两层代理的,即HTTP协议在Nginx等服务器的解析下,而后再传送给相应的Handler(PHP等)来处理。
简单地说,咱们有一个很是快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)。
自己接线员基本上速度是足够的,可是每次都卡在客服(Handler)了,老有客服处理速度太慢。,致使客服不够。
Websocket就解决了这样一个难题,创建后,能够直接跟接线员创建持久链接,有信息的时候客服想办法通知接线员,而后接线员在统一转交给客户。
这样就能够解决客服处理速度过慢的问题了。
同时,在传统的方式上,要不断的创建,关闭HTTP协议,因为HTTP是非状态性的,每次都要从新传输identity info(鉴别信息),来告诉服务端你是谁。
虽然接线员很快速,可是每次都要听这么一堆,效率也会有所降低的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,并且还会在网路传输中消耗过多的流量/时间。
可是Websocket只须要一次HTTP握手,因此说整个通信过程是创建在一次链接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(固然客户端仍是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不须要占用自己速度就慢的客服(Handler)了
--------------------
至于怎么在不支持Websocket的客户端上使用Websocket。。答案是:不能
可是能够经过上面说的 long poll 和 ajax 轮询来 模拟出相似的效果socket