1 方案分析
基于web实现实时地将更新的信息传送到客户端,方案1在浏览器端安装插件,基于套接口传送信息,或是使用 RMI、CORBA 进行远程调用;方案2则无须浏览器安装任何插件、基于 HTTP 长连接;方案3基于HTML5实现客户端和服务器端的双向通信。
1) 基于客户端套接口的"服务器推"技术,这其中又分为两种: Flash XMLSocket、JavaApplet
2) Comet基于Http长连接的"服务器推"技术,这其中又分为三种,基于Ajax的长轮询方式、基于Ajax的流方式、基于iframe和htmlfile的流方式;
1.1 普通轮询
普通轮询页面定时刷新,或者ajax定时轮询请求,此方案缺点明显不做赘述。
1.2 基于Ajax的长轮询
Ajax调用XMLHttpRequest对象发出异步请求,在Ajax回调函数中处理完服务器端返回的信息后,再次发出请求,重新建立连接。
这种方式服务器端会阻塞请求直到有数据传递或者超时时才返回。服务器端在处理过程中每间隔一定的时间检查是否有更新,如果没有更新,不执行操作.如果有更新,则返回数据,断开连接。客户端处理数据,进行下一轮的连接请求。这种方式是现在最常用的一种方式,web qq、web微信采用此方案。
1.3基于Ajax的流
这种方式在XMLHttpRequest的readyState==3(即数据传送过程中),客户端理数据可以接收并处,而不用关闭连接,服务器端是不停地向客户端发送数据。但是I E中readyState 等于3时不能读取服务器端返回的数据,所以目前IE不支持这种方式(Streaming Ajax)。的
1.4基于iframe和htmlfile的流
这种方式是在页面中嵌入一个隐藏的iframe,让其src属性指向一个长连接,这样服务器端会源源不断地向客户端发送数据,但是它发送的数据是javascript代码,用于操作父级页面的Dom树结构,但是它也存在一个问题,就是IE、FireFox的进度栏总是显示为正在加载状态,而且IE上方的图标会不停地转动,显示正在加载中,Google用了一个"htmlfile"的ActiveX,解决了这个问题,并用到了gmail+gtalk产品中。
1.5FlashXMLSocket
是利用Flash程序中的xmlsocket接口,在客户端程序中用javascript直接调用Flash的接口来实现数据传递。缺点:
1) 客户端必须安装 Flash 播放器;
2) 因为 XMLSocket 没有 HTTP 隧道功能,XMLSocket 类不能自动穿过防火墙;
3) 因为是使用套接口,需要设置一个通信端口,防火墙、代理服务器也可能对非 HTTP 通道端口进行限制;
这种方案在一些网络聊天室,网络互动游戏中已得到广泛使用。
1.6JavaApplet
在客户端建立和服务器端的套接口,但是javascript无法获取JavaApplet在服务器端返回的数据,无法更新页面。
1.7websocket
WebSocket protocol 是HTML5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。优点:性能优势与其他方案,有成熟的方案;缺点:新协议浏览器支持有限,需要与轮询方案结合使用,框架更新较快。来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29160570/viewspace-1759525/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29160570/viewspace-1759525/