<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

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

    為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 閱讀(24857) 評論(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)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产乱子伦精品免费女| 看全色黄大色大片免费久久| 亚洲乱码中文字幕综合| 曰韩无码AV片免费播放不卡 | 亚洲成人免费在线| 日韩亚洲Av人人夜夜澡人人爽| AAA日本高清在线播放免费观看 | 亚洲男人天堂av| 亚洲视频免费一区| 97se亚洲国产综合自在线| A级毛片内射免费视频| 亚洲成av人在线观看网站| 亚洲AⅤ永久无码精品AA | 春暖花开亚洲性无区一区二区| 免费一级毛片不卡在线播放| 一级黄色免费网站| 久久精品国产亚洲AV高清热| 日本阿v免费费视频完整版| 亚洲精品无码aⅴ中文字幕蜜桃| 国产乱子伦精品免费无码专区 | 四虎最新永久免费视频| 亚洲精品亚洲人成在线| 国产成人精品日本亚洲专区 | 亚洲kkk4444在线观看| 又爽又黄无遮挡高清免费视频| 国产精品永久免费视频| 久久亚洲私人国产精品vA| 在线看片无码永久免费视频| 美女被艹免费视频| 亚洲av无码乱码国产精品| 毛片免费观看视频| ssswww日本免费网站片| 精品亚洲成a人片在线观看少妇 | 久久亚洲精品无码av| 两个人的视频高清在线观看免费| 亚洲av极品无码专区在线观看| 国产美女做a免费视频软件| 成人免费一区二区三区| 亚洲一级毛片免费看| 亚洲无线一二三四区手机| 日本免费人成在线网站|