聶永的博客

          記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

          構(gòu)建實(shí)時(shí)Web的JAVA選擇組合:socket.io client + socketio-netty server

          前言

          現(xiàn)在一說(shuō)到實(shí)時(shí)web,可能大家不由自主的就想到了node.js,確實(shí),在語(yǔ)言級(jí)別node.js實(shí)現(xiàn)了異步的、基于事件機(jī)制的IO特性,使用簡(jiǎn)單。在JAVA語(yǔ)言層面,提供了NIO作為非阻塞IO的替代品。無(wú)論node.js還是JAVA,都沒有從真正意義上實(shí)現(xiàn)AIO(這個(gè)需要操作系統(tǒng)支持,依賴內(nèi)置庫(kù)/運(yùn)行時(shí)模擬支持)。

           

          Websocket/Flashsocket

          要說(shuō)到實(shí)時(shí)Web,就不能不說(shuō)到Websocket,目前存在的幾個(gè)草稿協(xié)議,若是要自己實(shí)現(xiàn)websocket協(xié)議支持,需要注意其握手協(xié)議等。

          目前對(duì)Websocket的支持,caniuse.com 給出了一張圖表,詳細(xì)說(shuō)明了各個(gè)瀏覽器的支持情況:

          image

          粉紅色區(qū)域表示不支持Websocket。

          至于IE瀏覽器,以及部分陳舊的桌面瀏覽器,可以選擇Flashsocket作為替代品。

          客戶端如何把Websocket和Flashsocket結(jié)合在一起使用,可借鑒開源項(xiàng)目:web-socket-js (客戶端的Websocket實(shí)現(xiàn)方案)

           

          其思路和socket.io大致一致,僅僅提供對(duì)websocket的客戶端的簡(jiǎn)單包裝,若是Android 上原生瀏覽器,沒有安裝Flash Lite情況下,就無(wú)能為力了。

          因此,僅僅憑借Websocket + Flashsocket,是不能夠完成跨瀏覽器、統(tǒng)一客戶端API的重任。

           

          socket.io通信傳輸協(xié)議

          socket.io 支持以下通信信道傳輸協(xié)議:

          • WebSocket
          • Adobe® Flash® Socket
          • AJAX long polling
          • AJAX multipart streaming
          • Forever Iframe
          • JSONP Polling

          socket.io客戶端和服務(wù)器端雙方約定適合當(dāng)前瀏覽器的最佳通信信道,然后正常通信。毫無(wú)疑問(wèn),基于全雙工通信信道的Websocket/Flashsocket傳輸協(xié)議,是數(shù)據(jù)傳輸最為快速的選擇,僅僅需要一個(gè)長(zhǎng)連接。

          基于上面圖表,我們?cè)谥付╯ocket.io transport參數(shù)時(shí),可以做到心里有數(shù)。

          在socketio-netty服務(wù)器端配置:

          transports = websocket,flashsocket,htmlfile,xhr-polling,jsonp-polling

          在客戶端,簡(jiǎn)單定義地址:

          var socket = io.connect('http://localhost:9000');

          在不遠(yuǎn)的將來(lái),桌面版瀏覽器可能升級(jí)了最新版本的websocket草案,導(dǎo)致客戶端原生的websocket協(xié)議無(wú)法被識(shí)別時(shí),可使用Flashsocket作為替代品。但總會(huì)有一種通信協(xié)議墊底,可以保證正常的運(yùn)轉(zhuǎn)。       

           

          在線畫板示范

          一個(gè)聊天的示范實(shí)時(shí)的數(shù)據(jù)量不大,那么一個(gè)在線畫板應(yīng)用呢,大家所繪制的線和點(diǎn)能夠立刻的同步到所有人的屏幕上去。嗯,它還是跨越目前所見的瀏覽器(IE6+,F(xiàn)irefox,Opera,Safari,Chrome等),支持Phonegap構(gòu)建,支持iphone,android,ipad等。

          因?yàn)闆]有部署的在線服務(wù)器,只能看一下簡(jiǎn)單視頻了:

          服務(wù)器端實(shí)現(xiàn)也是很簡(jiǎn)單,核心代碼不到100行(不包括main函數(shù)、日志輸出等):

          如何讓打包的android支持websocket協(xié)議,可參考:為Phonegap Android平臺(tái)增加websocket支持,使默認(rèn)成為socket.io首選通道選擇

          本人暫無(wú)JAVA主機(jī),無(wú)法部署到互聯(lián)網(wǎng)環(huán)境下。只能截個(gè)圖,看看先。

          項(xiàng)目演示代碼下載地址

           

          小結(jié)

          很顯然,實(shí)時(shí)Web,是一種技術(shù)趨勢(shì),將成為一種人們的默認(rèn)技術(shù)選擇,用以拉近和桌面應(yīng)用的距離。
          socket.io是一種數(shù)據(jù)實(shí)時(shí)推送、事件驅(qū)動(dòng)模型的框架,支持事件訂閱,簡(jiǎn)單易用。其價(jià)值目前看來(lái),還未被完整的挖掘出來(lái)。

          socket.io即提供了node.js服務(wù)器端(地址)又提供了客戶端(地址)的整體解決方案,而socketio-netty則是基于JAVA服務(wù)器端,支持最新socket.io client最新版規(guī)范。對(duì)JAVA編程人員來(lái)講,可以不用學(xué)習(xí)node.js,從而多了一個(gè)選擇。

          這里再解釋一下,為何構(gòu)建app而不是webapp的服務(wù)器端:

          1. Tomcat 7 雖然支持了Websocket協(xié)議,僅采用最新websocket草案版本
          2. Jetty 8 已經(jīng)支持Websocket,但才支持servlet 3.0規(guī)范
          3. 被綁定在某個(gè)單獨(dú)的Servlet容器上面,不為通用
          4. Servlet容器協(xié)議棧可能過(guò)于龐雜

          參考資料

          1. 實(shí)時(shí)Web時(shí)代即將到來(lái):不只谷歌Twitter玩得起
            http://tech.qq.com/a/20120521/000296.htm

          posted on 2012-05-24 09:10 nieyong 閱讀(30234) 評(píng)論(5)  編輯  收藏 所屬分類: socket.io

          評(píng)論

          # re: 構(gòu)建實(shí)時(shí)Web的JAVA選擇組合:socket.io client + socketio-netty server 2012-05-24 20:29 rox

          不錯(cuò),收藏了!  回復(fù)  更多評(píng)論   

          # re: 構(gòu)建實(shí)時(shí)Web的JAVA選擇組合:socket.io client + socketio-netty server 2013-04-08 10:14 vajra

          int port = 9000;
          MainServer mainServer = new MainServer(port);
          mainServer.addNamespace("/chat", new DemoChatHandler());
          mainServer.addNamespace("/news", new DemoNewsHandler());
          mainServer.start();
          按namespace訪問(wèn),F(xiàn)lashsocket不起作用?如果namespace為空則正常。  回復(fù)  更多評(píng)論   

          # re: 構(gòu)建實(shí)時(shí)Web的JAVA選擇組合:socket.io client + socketio-netty server 2014-01-06 10:43 鄧子彪

          感謝樓主了,樓主威武啊  回復(fù)  更多評(píng)論   

          # re: 構(gòu)建實(shí)時(shí)Web的JAVA選擇組合:socket.io client + socketio-netty server 2014-01-07 13:51 鄧子彪

          我想在我的項(xiàng)目中加入socketio,但是我想用我項(xiàng)目中自己用的那個(gè)端口號(hào),如何實(shí)現(xiàn)使得端口號(hào)不被占用而程序能運(yùn)行  回復(fù)  更多評(píng)論   

          # re: 構(gòu)建實(shí)時(shí)Web的JAVA選擇組合:socket.io client + socketio-netty server[未登錄] 2014-08-05 14:59 dd

          cool  回復(fù)  更多評(píng)論   

          公告

          所有文章皆為原創(chuàng),若轉(zhuǎn)載請(qǐng)標(biāo)明出處,謝謝~

          新浪微博,歡迎關(guān)注:

          導(dǎo)航

          <2012年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計(jì)

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個(gè)人收藏

          最新隨筆

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 通山县| 金溪县| 阿拉善盟| 康平县| 苏尼特左旗| 莱芜市| 聂荣县| 邳州市| 通许县| 邹平县| 安顺市| 墨脱县| 孟连| 靖边县| 杂多县| 伊通| 凤翔县| 翁源县| 汝阳县| 辽源市| 察哈| 惠东县| 红安县| 禹州市| 和林格尔县| 怀来县| 马山县| 扎赉特旗| 大宁县| 稻城县| 梁山县| 宁强县| 滦平县| 应城市| 荥经县| 阜康市| 通州市| 婺源县| 淄博市| 武汉市| 绥宁县|