日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

HTML5 WebSocket 技術(shù)介紹

系統(tǒng) 3048 0

WebSocket是html5規(guī)范新引入的功能,用于解決瀏覽器與后臺(tái)服務(wù)器雙向通訊的問(wèn)題,使用WebSocket技術(shù),后臺(tái)可以隨時(shí)向前端推送消息,以保證前后臺(tái)狀態(tài)統(tǒng)一,在傳統(tǒng)的無(wú)狀態(tài)HTTP協(xié)議中,這是“無(wú)法做到”的。

傳統(tǒng)服務(wù)端推(server push)技術(shù)

WebSocket提出之前,為了解決后臺(tái)推送消息到前臺(tái)的需求,提出了一些解決方案,這些方案使用已有的技術(shù)(如ajax,iframe,flashplayer,java applet …),通過(guò)一些變通的處理來(lái)實(shí)現(xiàn)。

簡(jiǎn)單輪詢(xún)

最簡(jiǎn)單的是前臺(tái)輪詢(xún),每隔一段時(shí)間去請(qǐng)求后臺(tái),以獲取最新?tīng)顟B(tài),這種方式最容易實(shí)現(xiàn),但效果也最差,頻繁盲目的調(diào)用后臺(tái),帶來(lái)不必要的開(kāi)銷(xiāo),且實(shí)時(shí)性無(wú)法保障,后臺(tái)出現(xiàn)更新,前端需要在下一次輪詢(xún)時(shí)才知道。

長(zhǎng)輪詢(xún)

為了解決這些弊端,進(jìn)化出長(zhǎng)輪詢(xún)技術(shù),輪詢(xún)請(qǐng)求會(huì)在后臺(tái)阻塞,相當(dāng)于保持一個(gè)長(zhǎng)連接,直到后臺(tái)出現(xiàn)更新或者超時(shí)才返回,這樣就可以保證更新的及時(shí)性,前端得到請(qǐng)求后,重新建立輪詢(xún)連接,等待后臺(tái)的更新通知。

http://www.ibm.com/developerworks/cn/web/wa-lo-comet/fig002.jpg

其他方案

其他解決方案無(wú)外乎保持一個(gè)長(zhǎng)連接(如Iframe及htmlfile流),實(shí)時(shí)的從后臺(tái)獲取信息,或者借助第三方插件(flashPlayer, jre),使用的是flash xmlsocket或者java applet socket技術(shù),這些方式都不夠純html,所以這里就不過(guò)多介紹了,更多傳統(tǒng)server push 技術(shù)可參考IBM的文章: http://www.ibm.com/developerworks/cn/web/wa-lo-comet/

WebSocket介紹

webSocket是html5新引入的技術(shù),允許后臺(tái)隨時(shí)向前端發(fā)送文本或者二進(jìn)制消息,WebSocket是一種全新的協(xié)議,不屬于http無(wú)狀態(tài)協(xié)議,協(xié)議名為”ws”,這意味著一個(gè)websocket連接地址會(huì)是這樣的寫(xiě)法:ws://twaver.com:8080/webSocketServer。ws不是http,所以傳統(tǒng)的web服務(wù)器不一定支持,需要服務(wù)器與瀏覽器同時(shí)支持, WebSocket才能正常運(yùn)行,目前的支持還不普遍,需要特別的web服務(wù)器和現(xiàn)代的瀏覽器。

瀏覽器對(duì)WebSocket的支持

Google Chrome瀏覽器最先支持WebSocket,隨后是Safari,F(xiàn)irefox,此外最新版本的Opera和IE(Opera11,IE10)也支持WebSocket。
下面是主要瀏覽器的支持情況,Opera11中默認(rèn)關(guān)閉了WebSocket支持,所以這里沒(méi)有列出,更多信息可參考:http://en.wikipedia.org/wiki/WebSocket 與 http://caniuse.com/#search=websockets

HTML5 WebSocket 技術(shù)介紹

客戶(hù)端WebSocket的主要方法

瀏覽器支持程度各有區(qū)別,前面wiki中關(guān)于WebSocket的“Browser support”章節(jié)有介紹,遵循w3c關(guān)于WebSocket API的相關(guān)規(guī)范,瀏覽器提供了WebSocket類(lèi)型,在Firefox中為MozWebSocket,檢測(cè)瀏覽器是否支持WebSocket可以使用下面的腳本代碼:

檢測(cè)瀏覽器是否支持WebSocket

1 window.WebSocket = window.WebSocket || window.MozWebSocket;
2 if (!window.WebSocket){
3 alert( "WebSocket not supported by this browser" );
4 return ;
5 }

構(gòu)造函數(shù) – WebSocket#constructor(url, optional protocols)
第一個(gè)參數(shù)是請(qǐng)求地址,第二個(gè)參數(shù)選填,表示協(xié)議名
使用示例:

1 var websocket = new WebSocket( " ws://127.0.0.1:8080/alarm/alarmServer " );

事件 – open/message/close/error
WebSocket#onopen, onmessage, onclose, onerror
連接打開(kāi)時(shí),回調(diào)onopen方法,接收到后臺(tái)消息時(shí)會(huì)觸發(fā)到onmessage事件,后臺(tái)關(guān)閉時(shí)調(diào)用onclose,出現(xiàn)連接異常時(shí)可在onerror中捕獲
使用示例:

1 websocket.onmessage = function (evt){
2 var data = evt.data;
3 }

方法 – send/close
發(fā)送消息 – WebSocket#send(data)
關(guān)閉連接 – WebSocket#close(optional code, optional reason)
使用示例:

1 websocket.send(JSON.stringify({action: "node.remove" , id: "001" }));

服務(wù)器對(duì)WebSocket的支持

WebSocket不同于http協(xié)議,傳統(tǒng)的web服務(wù)器通常不支持WebSocket,比如tomcat目前就不支持(tomcat 7.0.26 支持WebSocket了),反倒是一些小眾的或者更活躍的web server率先支持WebSocket,如jetty,以及基于node.js的WebSocket-Node擴(kuò)展,基本上各種編程語(yǔ)言都有相應(yīng)的服務(wù)器可以選擇,下圖是我列舉的幾種,詳細(xì)情況參閱:http://en.wikipedia.org/wiki/Comparison_of_WebSocket_implementations
HTML5 WebSocket 技術(shù)介紹
服務(wù)器端編程語(yǔ)言各不相同,具體實(shí)現(xiàn)自然也不相同,即使是同一種語(yǔ)言,實(shí)現(xiàn)類(lèi)和接口函數(shù)也有很大的差別,比如jetty和netty都是基于java語(yǔ)言,但他們的實(shí)現(xiàn)類(lèi)幾乎沒(méi)有相同命名的,下面我以jetty(http://www.eclipse.org/jetty)為例,簡(jiǎn)單介紹WebSocket相關(guān)的類(lèi)和方法:

jetty對(duì)WebSocket的實(shí)現(xiàn)

WebSocketServlet 基于servlet標(biāo)準(zhǔn),增加了 doWebSocketConnect(…) 方法,為客戶(hù)端請(qǐng)求創(chuàng)建一個(gè)后臺(tái)對(duì)應(yīng)的WebSocket實(shí)例

1 org.eclipse.jetty.websocket.WebSocketServlet
2 {
3 WebSocket doWebSocketConnect(HttpServletRequest request, String protocol)
4 }

后臺(tái)WebSocket類(lèi),與客戶(hù)端WebSocket類(lèi)對(duì)應(yīng),能監(jiān)聽(tīng)open, message, close等狀態(tài)變化事件,并包含一個(gè)Connection屬性,用于向客戶(hù)端發(fā)送消息

1 org.eclipse.jetty.websocket.WebSocket
2 org.eclipse.jetty.websocket.WebSocket.OnTextMessage
3 {
4 void onOpen(Connection connect);
5 void onClose( int code, String message);
6 void onMessage(String message);
7 }

WebSocket.Connection 后臺(tái)連接類(lèi),包含于 WebSocket 對(duì)象中,用于向客戶(hù)端推送消息

1 org.eclipse.jetty.websocket.WebSocket.Connection
2 {
3 void sendMessage(String message);
4 }

本篇先做介紹,后續(xù)將介紹一個(gè)WebSocket與TWaver組件結(jié)合的實(shí)例…



HTML5 WebSocket 技術(shù)介紹


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。?!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 敖汉旗| 乐清市| 涿州市| 巍山| 稷山县| 张掖市| 庐江县| 九江市| 天台县| 武平县| 盐亭县| 水城县| 宁明县| 岳阳市| 伊金霍洛旗| 定兴县| 永春县| 齐齐哈尔市| 房产| 广丰县| 华阴市| 城口县| 衡阳市| 班玛县| 高安市| 礼泉县| 保德县| 襄城县| 西盟| 临夏县| 藁城市| 建昌县| 德兴市| 鄂伦春自治旗| 英超| 临夏县| 正阳县| 横山县| 盐津县| 叙永县| 东兰县|