為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇
廣而告之
使用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
官網定義為:
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具有無法超越的速度優勢,同時雙向數據傳輸通道,通過觀察可以很明顯的感覺到。
起因
- 我的android系統是2.3的,其原生的瀏覽器不支持websocket通信協議(ucweb,qq,opear mini 等都支持較為完整的HTML5規范)。
- Phonegap轉換的APK包,會調用android內置瀏覽器,因此導致websocket無法使用。
- 據調研Android 2/3.* 原生瀏覽器不支持websocket,至于Android 4.*,沒有測試過。
如何確認瀏覽器對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客戶端實現:
https://github.com/koush/android-websockets#readme
有興趣者,可以參考一下。
本打算使用Netty構建一個websocket客戶端,然后結合js等,但有開源實現,不再閉門造車。
- 在Eclipse中新建Android Project項目chatdemo
- 把animesh kumar的websocket-android-phonegap項目java文件打成phonegap-websocket-support.jar包,存放在 android project的libs目錄下
- 把websocket.js存放在 assets/www/js目錄下
- 修改項目啟動類App.java
- 添加<script src="js/websocket.js"></script>
簡單說明
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,步驟很簡單:
- 在eclipse下搭建android project
- 拷貝jar以及socekt.js到相應目錄
- 修改App.java(其它android啟動類,方法名不一樣,但方法體一致)
- 在首頁或者需要的頁面,在 socket.io js醫用的前面,添加<script src="js/websocket.js"></script>引用即可
示范代碼
- socket.io 框架內置的chat聊天示范和socketio-netty所提供聊天示范完全一致,除了服務器端實現不同
- 簡單包裝成android項目,僅用于演示使用,因此界面有些大
- 需要一個服務器端,socket.io或者socketio-netty的都可以
- 本文Android示范chat下載 下載
- phonegap-websocket-support.jar
參考資料
- Phonegap:
http://phonegap.com/ -
WebSocket support in Android’s Phonegap apps
http://anismiles.wordpress.com/2011/02/03/websocket-support-in-android%E2%80%99s-phonegap-apps/ - websocket-android-phonegap
https://github.com/anismiles/websocket-android-phonegap
posted on 2012-05-10 14:10 nieyong 閱讀(24854) 評論(12) 編輯 收藏 所屬分類: socket.io