轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
优点:后端程序编写比较容易。
缺点:请求中有大半是无用,浪费带宽和服务器资源。
实例:适于小型应用。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求。
缺点:服务器hold连接会消耗资源。
实例:WebQQ、Hi网页版、Facebook IM。
长连接:长连接的技术主要是用Comet,采用的技术分浏览器来实现,ie上用iframe,别的浏览器用xhr来实现。在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求。
缺点:服务器维护一个长连接会增加开销。
实例:Gmail聊天
Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
优点:实现真正的即时通信,而不是伪即时。
缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。
实例:网络互动游戏。
现在对于大部分普通网站来说,使用的web服务器的特点是不适合长连接的,web服务器特点是高并发,及时销毁,一个很烂的服务器就可以维持很高的同时访问请求,而长连接对于普通web服务器的就不那么适合了,在实时性要求高的情况下需要增加硬件成本来维持。
大部分b/s架构不会要求太高的实时性,所以长连接看起来很美好,用的地方却很少。
而且要想用长连接,必须是异步非阻塞模式(如tornado),不然一台机器支撑人数少的可怜。
WebSocket
websocket协议是一种相对于HTTP的协议,html5之后,采用websocket既可以解决长连接的问题,而且减少了资源消耗。
长连接应该是,客户端往服务器端发送一个http请求,然后服务端等到任务完成之后才返回。这个任务完成的时间可以是几个小时,而一般的http请求得到返回的时间没那么长。客户端得到服务器端返回的信息之后,马上又发一个请求,然后服务器端继续前面的事情,也就是不立即返回,等有了新的信息之后再返回。
websocket是指客户端和服务器之间建立一个websockt连接,然后客户端可以给服务器发信息,服务器也可以给客户端发信息。从行为上来说,对比长连接,服务器的不需要把请求hold住,而客户端也不需要接收一次信息后再立刻发送请求。
在没有websocket之前,只有长连接可以选择。
http协议决定了浏览器端总是主动发起方,http的服务端总是被动的接受、响应请求,从不主动。
而WebSocket协议,在连接之后,客户端、服务端是完全平等的,不存在主动、被动之说。