现在的很多web应用中都强调消息的即时性,为了达到实时的数据交换,采用的方式有轮询、长轮询、流技术等。
轮询
是指客户端定时向服务器发送请求,早期的轮询通过不断刷新页面实现,后来通过Ajax技术实现定时异步刷新。如果知道数据的准确更新时间,轮询是一种很好的方式。但是有的情况下数据更新时间是未知的,这时候采用轮询的方式会产生没有必要的连接或者信息更新不及时。
长轮询
长轮询是指客户端向服务器发送请求,服务器端如果没有任何数据返回,会保持请求打开状态,直至有数据返回或者超时。 长轮询也称为Comet或者反向Ajax,这种方式减少了客户端与服务器端的交互次数,避免了一些没有意义的连接。但当数据更新频繁时,长轮询和轮询并没有明显差异。
流
流技术是指客户端向服务器发送请求,服务器响应并不断更新连接状态,以确保这个连接在客户端与服务端之间一直有效。流技术是实现不可预测的数据传递的极佳方案,但服务器从不返回完整的响应,这种情况下,代理和防火墙可能缓存响应,导致数据传递延时增加。
上述技术并不是真正的实时技术,只是在用 Ajax 方式来模拟实时的效果,在每次客户端和服务器端交互的时候都是一次 HTTP 的请求和应答的过程,而每一次的 HTTP 请求和应答都带有完整的 HTTP 头信息,这就增加了每次传输的数据量。而且客户端必须等待服务器端的响应后才能继续发送请求,这种半双工的工作方式也增加了时延。
WebSocket
WebSocket是HTML5中很重要的一部分,WebSocket即web+socket,建立在web上的socket连接。WebSocket可以理解为“HTTP握手+TCP传输”,web上采用的是应用层HTTP协议,socket采用的是传输层TCP协议,初始连接时,WebSocket发出的是HTTP请求,连接建立后通过TCP进行数据的交换。WebSocket 连接本质上就是一个 TCP 连接,所以在数据传输的稳定性和数据传输量的大小方面,和轮询以及 Comet 技术比较,具有很大的性能优势。WebSocket减少了时延,只需发出一个请求,一旦建立起连接,服务器可以在需要的时候返回数据,客户端不需要等待服务器的数据返回即可进行下一步的数据发送,是一种全双工的通信机制。
参考文章
《HTML5 websocket 权威指南》