一直以来,解决服务器有新数据时,立即将数据发送到客户端的方案种类繁多,例如“推送”或Comet。
实现Comet有两种方式:长轮询与http流
长轮询是短轮询的翻版,短轮询的方式是:页面定时向服务器发送请求,看有没有更新的数据。
而长轮询的方式是,页面向服务器发起一个请求,服务器一直保持tcp连接打开,知道有数据可发送。发送完数据后,页面关闭该连接,随即又发起一个新的服务器请求,在这一过程中循环。
短轮询和长轮询的区别是:短轮询中服务器对请求立即响应,而长轮询中服务器等待新的数据到来才响应,因此实现了服务器向页面推送实时,并减少了页面的请求次数。
http流不同于上述两种轮询,因为它在页面整个生命周期内只使用一个HTTP连接,具体使用方法即页面向浏览器发送一个请求,而服务器保持tcp连接打开,然后不断向浏览器发送数据。
Comet采用了Ajax。这种技术虽然可达到双向通信,但依然需要发出请求,而且在Comet中,普遍采用了长连接,这会导致大量服务器带宽和资源被占用。
最常用的一种是对服务器发起连接创建假象,被称为长轮询。利用长轮询客户端可以打开指向服务器的HTTP连接,而服务器会一直保持连接打开,直到发送响应。服务器值要实际拥有新数据,就会发送响应。
但是这些解决方案都存在一个共同的问题:由于HTTP协议的开销导致它们不适用于低延迟应用。
Http协议的弊端主要如下:
- HTTP协议为半