Pages

Tuesday, March 16, 2010

实验-Javascript Message Protocol - 模拟Stomp数据推送

前段时间用过Stomp协议,通过Orbited服务器在页面中利用JavasScript进行数据推送,真正实现JS数据的实时推送,为什么这么说?因为HTTP 是客户端-服务器通信的标准协议,它是无状态的,而且在某种意义上来说,也是一种单向的协议。之前看到过IBM官方上的一篇文章,上面详细讲解了页面中常用到的(模拟)推送技术。简要介绍下通过Ajax技术的有:
  • 短轮询短轮询也称为高频轮询,客户端会以固定(或可配置)的时间间隔与服务器联系,查找是否有新更新可用。(之前用的较多)
  • 长轮询这种方法的理念就是客户端建立连接,服务器阻塞连接(通过使请求线程在某些条件下处于等待状态),有数据可用时,服务器将通过阻塞的连接发送数据,随后关闭连接。客户端在接收到更新后,立即重新建立连接,服务器重复上述过程,以此实现近于实时的通信。
  • 流通道流通道(streaming channel)与长轮询大致相同,差别在于服务器不会关闭响应流。而是特意保持其处于打开状态,使浏览器认为还有更多数据即将到来。(没有研究过此方法)
然而,虽然上述技术都被广泛利用到了Web应用中,但是它的缺点是显而易见的,比如说,当没有数据更新时短轮询极度浪费网络资源,缺乏可伸缩性等等。

当然,庆幸的是我们还有别的选择,基于套接字的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类实现了如下接口:
  1. connect(server, port, header) : Void :连接远程服务器
  2. onConnect : Event :成功连接远程服务器端时调用
  3. send(str) : Void :发送消息
  4. onMessage(str) : Event :接收到消息时调用
  5. subscribe(subscribe) : Void :订阅某个频道
此实验对于浏览器来说是跨浏览器的(已经做过测试),对于以后的程序开发来说,可以针对接口实现各种语言的客户端程序,比如说Java,C#,python等等,对于消息传送,只要是JMP的客户端程序都可以进行数据传输,比如说Air程序与Web App 中的 Javascript 交互,这些都是以后需要做的目标。

看过之后,可能会找到Stomp的影子,确实不错,当我用过Stomp时,感觉当Javascript能直接和远程通信进行交互,实现数据无刷新实时推送,那么在页面实现的效果(尤其是聊天室)和用户体验会提高很多,比如说你看到的Google Wave实时获取对方输入,Google Reader实时推送文章,各类社交网站的留言推送等等。

当然实现上述功能还需要很久是的时间和投入,我想的是太简单了点 ,而且我相信Google也会有独到的技术。

今天完成了这个实验的以上接口,基本可以用做工具和别的应用程序整合使用。
明天打算开始做一个简单Chat Web应用程序去测试JMP,使其更加完善。

部分关于Ajax推送的文字来自于《在Ajax应用程序中实现实时数据推送》,相当好的一篇文章。

No comments:

Post a Comment