标签:android cWeb blog http ar io os 使用 sp
使用socket.io作为跨浏览器平台的实时推送首选,经测试在各个主流浏览器上测试都确实具有良好的下实时表现。这里为推广socketio-netty服务器端实现哈,做次广告,同时预热一下:
socketio-netty : 又一款socket.io服务器端实现,兼容0.9-1.0版本~
我们要构建一个在市面上常见浏览器上都可以正常运行的集体聊天应用,保证在IE6+,Firefox,Chrome,Safari,Opear,IOS,Android等可以正常运转,根据具体环境自动选择最佳的通信通道。
嗯,既然是跨浏览器平台,那自然选择socket.io(客户端js) 了。它也是本文的重心,本文的最终是让socket.io(客户端js) 版本在Phonegap包装的Android Apk程序中可以使用Websocket协议,以达到快速交换数据的目的,提高交换性能。
同时也保证我们的示范应用尽可能的做到编写一次,到处运行哈。
还好,有了socket.io(客户端js) + socketio-netty(socket.io服务器端JAVA实现) + Phonegap, 我们构建各种交互性非常强的的跨浏览器、跨移动应用的HTML应用,是个不错的选择。
另,本文示范项目为仅仅为演示其功能,不保证样式。
官网定义为:
PhoneGap is an HTML5 app platform that allows you to author native applications with web technologies and get access to APIs and app stores.
中文翻译为:
PhoneGap是一个开源的开发框架,使用HTML,CSS和JavaScript来构建跨平台的的移动应用程序
可使用HTML + CSS + Javascript构建跨平台的移动引用,确实很不错,值得推荐。
更棒的,可以利用其云构建服务(https://build.phonegap.com/apps ) ,本机编写好应用之后(保证首页为index.html,涉及到的css/js存放在一起),打包成zip,上传,自动会为我们自动构建不同平台下的部署包,十分方便。
表面上看,一切都很完美,但部署到Android系统之后,发现socket.io无法使用websocket双向的通道,socket.io默认采用xhr-long polling通信模式。有些无奈。
在实时交互数据量很大的情况下,相比xhr-long polling, jsonp polling,Websocket/Flashsocket具有无法超越的速度优势,同时双向数据传输通道,通过观察可以很明显的感觉到。
如何确认浏览器对html5的支持情况, 浏览器访问 http://html5test.com 即可查询对HTML5的支持情况,以及跑分等。
嗯,据传言,Phonegap会在2.0版本之后,添加对Android的websocket支持,但目前版本为1.7。
animesh kumar 开发的websocket-android-phonegap项目,已经做到了让Phonegap支持websocket客户端协议,使用java nio编写websocket客户端协议连接,同时Phonegap支持自定义组件,支持JS和JAVA代码的相互调用开放架构,这样就促成了伪装的webscoket.js。
其有些DWR的味道,但更为灵活。
另外还有一个单纯的socket.io android客户端实现:
有兴趣者,可以参考一下。
本打算使用Netty构建一个websocket客户端,然后结合js等,但有开源实现,不再闭门造车。
1. App.java修改后:
确保继承DroidGap,并且指定绑定语句:
// 绑定websocket支持
appView.addJavascriptInterface(new WebSocketFactory(appView),
"WebSocketFactory");
JAVA端设定完毕。
2. 客户端的修改
需要在html页面端做些手脚,优先加载websocket.js进行一些环境变量的设定,这样socket.io就可以检测websocket的支持。
websocekt.js的初始化代码:
需要注意其初始化代码:
// window object
var global = window;// WebSocket Object. All listener methods are cleaned up!
......
var WebSocket = global.WebSocket = function(url)
socket.io client websocket 代码片段:
看一下websocket的检测函数:
WS.check = function () {
return (‘WebSocket‘ in global && !(‘__addTask‘ in WebSocket))
|| ‘MozWebSocket‘ in global;
};
很自然的,自定义的websocket.js 和 socket.io两者就能够很自然的衔接在一起了。
因此,必须的页面JS加载顺序为:
<!--android平台需要添加,其它移动平台,比如ios则不需要 -->
<!--一定要放在socket.io.min.js前面 -->
<script src="js/websocket.js"></script>
<script src="js/socket.io.min.js"></script>
在HTML页面端,我们仅仅需要添加一行<script src="js/websocket.js"></script>引用,就做到了让android平台下socket.io优先选择websocket,很简单,也很使用。
至于其它平台,则不需要考虑这么,仅仅把/chatdemo/assets/www目录下打包成zip包(切记把<script src="js/websocket.js"></script>去除掉),上传到云构建平台自动构建即可。
Phonegap下让android平台支持websocket,步骤很简单:
为Phonegap Android平台增加websocket支持,使默认成为socket.io首选通
标签:android cWeb blog http ar io os 使用 sp
原文地址:http://my.oschina.net/u/1266171/blog/357258