websocket 基于http协议(websocket的握手时基于http发起的)、达到实时推送的效果,以前好多需要实时获取的服务信心都是通过ajax轮询或者 long poll来实现,但消耗资源且存在延迟。


ajax poll :客户端不断询问服务端是否有信息给自己
long poll:  阻塞式轮询(客户端发起连接后,直到服务端返回信息,则结束本次连接,接着建立新连接,这样周而复始)

以上两种方式都是在不断的建立新的http连接,等待服务端处理,http是被动的,服务端不能主动联系客户端

websocket解决的http的几大难题:
    当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦,
    只需要经过一次HTTP请求,就可以做到源源不断的信息传送了
    解决了轮询同步有延迟,而且还非常消耗资源的这种情况,
    同时克服了http的无状态性(解决了要反复解析HTTP协议,还要查看identity info的信息)


知乎上有人说道:

WebSocket 解决的第一个问题是,通过第一个 HTTP request 建立了 TCP 连接之后,之后的交换数据都不需要再发 HTTP request了,使得这个长连接变成了一个真.长连接
另一个巨大的存在是中间的网络链路。一个 HTTP/WebSocket 连接往往要经过无数的路由,防火墙

在这过程中,中间节点的处理方法很可能会让你意想不到,比如说,这些坑爹的中间节点可能会认为一份连接在一段时间内没有数据发送就等于失效,它们会自作主张的切断这些连接。


而解决方案,WebSocket 的设计者们也早已想过。就是让服务器和客户端能够发送 Ping/Pong Frame(RFC 6455 - The WebSocket Protocol)。这种 Frame 是一种特殊的数据包,它只包含一些元数据而不需要真正的 Data Payload,可以在不影响 Application 的情况下维持住中间网络的连接状态。

https://tools.ietf.org/html/rfc6455
https://tools.ietf.org/html/rfc6455#section-5.5.2


websocket实现:

前端:

值的一提的Socket.io  它通过Node.js实现WebSocket服务端,同时也提供客户端JS库。http://Socket.IO支持以事件为基础的实时双向通讯,它可以工作在任何平台、浏览器或移动设备。


后端:

Java EE 7引入了一系列新的API并修改了部分既有的API以满足web开发者使用HTML5的相关需求。这些新的API主要由三个方面组成:处理JSON的新API、针对JSF的新属性处理的重大更新以及支持WebSocket协议(组成HTML5的众多技术之一)的最新API

http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/HomeWebsocket/WebsocketHome.html


java基于tomcat实现demo:(客户端连接服务器后,服务器每隔一段时间向客户端推送信息),

code地址:https://github.com/langlichong/java-websocket-tomcat