- 短轮询:短轮询也称为高频轮询,客户端会以固定(或可配置)的时间间隔与服务器联系,查找是否有新更新可用。(之前用的较多)
- 长轮询:这种方法的理念就是客户端建立连接,服务器阻塞连接(通过使请求线程在某些条件下处于等待状态),有数据可用时,服务器将通过阻塞的连接发送数据,随后关闭连接。客户端在接收到更新后,立即重新建立连接,服务器重复上述过程,以此实现近于实时的通信。
- 流通道:流通道(streaming channel)与长轮询大致相同,差别在于服务器不会关闭响应流。而是特意保持其处于打开状态,使浏览器认为还有更多数据即将到来。(没有研究过此方法)
当然,庆幸的是我们还有别的选择,基于套接字的RIA技术,利用flash或者flex技术中的套接字实现数据推送。另外,如果能和Javascript脚本进行数据套接字推送的话,就更完美了。其实绕个弯就可以。此实验就是为了解决Javascript获取实时数据的问题。
我在实验中用到了Python Twisted(用于套接字服务器)+ Flash AS3(中间套接字层)+ Javascript(客户端)+ Tomcat(Web服务器),取名叫做JMP-Javascript Message Protocol。Flash中JmpClient类实现了与Python Twisted服务器的交互,同时还创建Flash应用程序管理客户端JavaScript中JmpClient类集合,利用Flash和Javascript可相互控制的方法,把整个Flash应用程序中的事件触发与Javascript绑定,实现为中间层,而客户端JmpClient类实现了如下接口:
- connect(server, port, header) : Void :连接远程服务器
- onConnect : Event :成功连接远程服务器端时调用
- send(str) : Void :发送消息
- onMessage(str) : Event :接收到消息时调用
- subscribe(subscribe) : Void :订阅某个频道
看过之后,可能会找到Stomp的影子,确实不错,当我用过Stomp时,感觉当Javascript能直接和远程通信进行交互,实现数据无刷新实时推送,那么在页面实现的效果(尤其是聊天室)和用户体验会提高很多,比如说你看到的Google Wave实时获取对方输入,Google Reader实时推送文章,各类社交网站的留言推送等等。
当然实现上述功能还需要很久是的时间和投入,我想的是太简单了点 ,而且我相信Google也会有独到的技术。
今天完成了这个实验的以上接口,基本可以用做工具和别的应用程序整合使用。
明天打算开始做一个简单Chat Web应用程序去测试JMP,使其更加完善。
部分关于Ajax推送的文字来自于《在Ajax应用程序中实现实时数据推送》,相当好的一篇文章。
No comments:
Post a Comment