聶永的博客

          記錄工作/學習的點點滴滴。

          為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具有無法超越的速度優勢,同時雙向數據傳輸通道,通過觀察可以很明顯的感覺到。

           

          起因

          1. 我的android系統是2.3的,其原生的瀏覽器不支持websocket通信協議(ucweb,qq,opear mini 等都支持較為完整的HTML5規范)。
          2. Phonegap轉換的APK包,會調用android內置瀏覽器,因此導致websocket無法使用。
          3. 據調研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等,但有開源實現,不再閉門造車。

          1. 在Eclipse中新建Android Project項目chatdemo
          2. animesh kumarwebsocket-android-phonegap項目java文件打成phonegap-websocket-support.jar包,存放在 android project的libs目錄下
          3. websocket.js存放在 assets/www/js目錄下
          4. 修改項目啟動類App.java
          5. 添加<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,步驟很簡單:

          1. 在eclipse下搭建android project
          2. 拷貝jar以及socekt.js到相應目錄
          3. 修改App.java(其它android啟動類,方法名不一樣,但方法體一致)
          4. 在首頁或者需要的頁面,在 socket.io js醫用的前面,添加<script src="js/websocket.js"></script>引用即可

           

          示范代碼

          1. socket.io 框架內置的chat聊天示范和socketio-netty所提供聊天示范完全一致,除了服務器端實現不同
          2. 簡單包裝成android項目,僅用于演示使用,因此界面有些大
          3. 需要一個服務器端,socket.io或者socketio-netty的都可以
          4. 本文Android示范chat下載 下載
          5. phonegap-websocket-support.jar

           

          參考資料

          1. Phonegap:
             http://phonegap.com/
          2. WebSocket support in Android’s Phonegap apps
            http://anismiles.wordpress.com/2011/02/03/websocket-support-in-android%E2%80%99s-phonegap-apps/

          3. websocket-android-phonegap
            https://github.com/anismiles/websocket-android-phonegap

          posted on 2012-05-10 14:10 nieyong 閱讀(24854) 評論(12)  編輯  收藏 所屬分類: socket.io

          評論

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2012-05-10 17:14 ge_star

          animesh kumar 開發的websocket-android-phonegap項目只支持DRAFT75/76的協議~對于目前的很多服務器不支持,例如tomcat7,tomcat7采用RCFRFC 6455,所以需要自己改握手和通訊協議  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2012-05-11 08:33 tb

          這個好啊 方便我們的手機開發  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2012-05-11 09:43 nieyong

          @ge_star
          采用Netty,或者http://socket.io,或者http://code.google.com/p/socketio-netty/
          或者,直接增加對RCFRFC 6455的支持等。  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2012-06-07 17:52 josh

          請教一下 我利用IFRAME 去崁入http://www.websocket.org/echo.html

          語法如下:
          <iframe src="http://www.websocket.org/echo.html" width="100%" height="100%" ></iframe>

          但卻出現不支援 可否請教原因  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2012-06-11 09:09 nieyong

          @josh
          您是什么平臺 ?若是android,默認的瀏覽器不支持websocket協議。  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇[未登錄] 2012-07-26 17:14 jarry

          socket.io client websocket 代碼片段:最后一部分貌似有問題?module不存在。。。(
          'undefined' != typeof io ? io.Transport : module.exports
          , 'undefined' != typeof io ? io : module.parent.exports
          , this
          )  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2012-08-29 10:35 零度火云

          感謝您詳細的方案,正好需要  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2013-05-28 18:33 FreezeSoul

          請問,為什么切換連接后會報超時,但我本地用chrome打開是可以
          (注釋websocket.js)

          連接:http://192.168.23.1:9000/chat

          異常:DroidGap: TIMEOUT ERROR! - calling webViewClient
            回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2013-09-13 15:13 yimengyuanyun

          鏈接不上服務器,不明白為什么
          var s = new WebSocket("ws://127.0.0.1:8000/");
          這個url是服務器的端口嗎?為什么我這個就不可以呢  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2013-12-16 09:28 唐鑫

          為什么報 has no method 'getintance'錯呢?  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2014-07-02 16:19 馬躍

          為什么報 has no method 'getintance'錯呢? 我也遇到了同樣的問題  回復  更多評論   

          # re: 為Phonegap Android平臺增加websocket支持,使默認成為socket.io首選通道選擇 2014-07-02 16:20 馬躍

          有解決的幫下忙好嗎  回復  更多評論   

          公告

          所有文章皆為原創,若轉載請標明出處,謝謝~

          新浪微博,歡迎關注:

          導航

          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          統計

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個人收藏

          最新隨筆

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阜城县| 博乐市| 盐城市| 德庆县| 五常市| 南召县| 南投市| 惠东县| 邓州市| 宝鸡市| 绍兴县| 双流县| 庄河市| 台州市| 邓州市| 台南市| 龙井市| 蒙阴县| 云龙县| 井陉县| 颍上县| 资溪县| 泗水县| 荣成市| 新乡县| 浦县| 邓州市| 六安市| 博湖县| 灵台县| 万山特区| 加查县| 沭阳县| 普兰店市| 鸡西市| 綦江县| 磐安县| 郴州市| 甘孜| 内丘县| 苍溪县|