利用websocket连接服务器的最大特点就是:持久链接的特点。
共同点是:都是基于TCP协议进行client-server的链接,websocket是HTML5提出的一套补缺HTTP链接中不能持久链接的特点(除长连接,长轮询)
轮询(AJAX):指的是浏览器端定时发送请求到服务器端,服务器接收到请求后作出响应并关闭连接该次链接。
(缺点是:在时间定时上需要考虑更多,多久进行一次轮询等)
长轮询:跟轮询的原理相似,但是有个重要的特点是,浏览器发送请求后,服务器此时是保持该链接(主要方法是死循环执行,定时sleep超时后断开连接),在定时断开链接之前,获取到最新数据并返回浏览器后,在由浏览器重新发起一个新的请求。
(缺点是:会并发性的发起很多的http请求。)
轮询与长轮询共同的缺点是:需要浪费很多的http资源,请求的数量较大。
长连接:类似前端中跨域请求中,利用iframe的src的跨域特点,在页面中隐藏一个iframe进行定时获取后台数据,反馈到iframe中,实现后台数据的获取。
长链接的缺点也是:必须要定时发起请求服务器更新数据资源。
前面的问题是:
在连接后的过程中,服务器都会不停的链接与断开,数据头信息不停重复的发送,浪费宽带,信息交换的效率低下。
他们之间建立的“长连接”是“伪长连接”,只是靠服务器不断循环实现了所谓的长连接效果。
websocket解决的问题:
实质的推送方式是服务器主动推送,只要有数据就推送到请求方。(变被动为主动)
websocket采用异步回调的方式接受消息,当建立通信连接,可以做到持久性的连接,并进行通信。
(而不像上面的几种方式一样需要定时进行发起请求到服务器获取最新更新信息,显得相当的被动)
websocket通过自己的 WS 协议(此处与HTTP协议有所区别)创建一个基于HTTP request请求并创建TCP链接之后,之后的数据交换都不需要再次去创建链接,实现真正的长连接。
websocket协议本质上是一个基于TCP的协议。建立连接需要握手,客户端(浏览器)首先向服务器(web server)发起一条特殊的http请求,web server解析后生成应答到浏览器,这样子一个websocket连接就建立了,直到某一方关闭连接。
当然基于Node.js编写的一个Socket.IO 是一个开源实现WebSocket的库,它通过node.js实现服务端的同时,也提供了客户端js库,socket.io 支持事件触发为基础进行的双向数据通信。
查看更多相关Socket.IO的资料转到:http://socket.io/