摘要:國際慣例,先上維基百科的解釋。維基百科上面是維基百科對的解釋,別問我如何解釋上面這段話,因為我也沒看懂,那么下面我用人話解釋一下吧僅僅是我的理解是一個協議,可以簡單看成是協議的一個補充協議,借助協議的基礎完成服務器主動與客戶端實時傳輸數據。
現在,很多網站為了實現推送技術,所用的技術都是輪詢。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對服務器發出HTTP request,然后由服務器返回最新的數據給客戶端的瀏覽器。這種傳統的模式帶來很明顯的缺點,即瀏覽器需要不斷的向服務器發出請求,然而HTTP request的header是非常長的,里面包含的數據可能只是一個很小的值,這樣會占用很多的帶寬和服務器資源。
Ajax輪詢——“定時的通過Ajax查詢服務端"
而比較新的技術去做輪詢的效果是Comet,使用了AJAX。但這種技術雖然可達到雙向通信,但依然需要發出請求,而且在Comet中,普遍采用了長鏈接,這也會大量消耗服務器帶寬和資源。
Comet——隨著AJAX技術興起而產生的新技術
用大白話揭開Ajax長輪詢(long polling)的神秘面紗
面對這種狀況,HTML5定義了WebSocket協議,能更好的節省服務器資源和帶寬并達到實時通訊。
國際慣例,先上維基百科的解釋。
"WebSocket是HTML5開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議。"
——維基百科
上面是維基百科對WebSocket的解釋,別問我如何解釋上面這段話,因為我也沒看懂,那么下面我用人話解釋一下吧(僅僅是我的理解):
WebSocket是一個協議,可以簡單看成是HTTP協議的一個補充協議,WebSocket借助HTTP協議的基礎完成服務器主動與客戶端實時傳輸數據。
這是WebSocket和HTTP之間的關系,有交集,但是并不是全部。
WebSocket只是HTML5其中的一個API(HTML5推出了很多新的API,贊),這個API可以通過WebSocket協議實現WebSocket技術。
在WebSocket API中,瀏覽器和服務器只需要做一個握手的動作,然后,瀏覽器和服務器之間就形成了一條快速通道。兩者之間就直接可以數據互相傳送。
關鍵點在于如何"握手",只要我們完成了握手的這個工作,那么WebScoket技術就算是能夠使用了。
前面說了WebSocket與HTTP有交集的,或者可以說WebSocket借助了HTTP的基礎就是體現在這里了,可以看到圖中的紅點,分別是WebSocket的請求頭和響應頭,一來一回,握手也就完成了,實時連接也就建立起來了!
下面講解一下幾個重要的頭參數:
Request: Upgrade:WebSocket; //指定WebSocket協議 Sec-WebSocket-Version: 13 //指定Websocket Draft協議版本 Sec-WebSocket-Key:Cv8RLRCr07Ujlqexqq9Nrw== //驗證key值,由瀏覽器隨機生成,可以理解為一個校驗碼 Reponse: Connection:Upgrade ; Upgrade:webSocket;//沒錯我就是webSocket Sec-WebSocket-Accept:rC+mM80welcslAqBHpav4MSDzAU= ;//這是返回頭校驗碼,和請求頭的Key配對 Sec-WebSocket-Version: 13 //指定Websocket Draft協議版本
以上就是一次完成的WebSocket握手,握手完之后就可以進行實時通信了。
先上個代碼看看:
本文所用服務端語言為PHP,其他語言可以對照著看,大的原理都一樣:
WebSocket Demo下載鏈接(代碼實在太長,直接下載吧)
使用方法
Windows下要用cmd啟動server.php文件,Linux同理 然后用瀏覽器訪問index.html Demo是上網找的,不能當做實際用途,簡單看看運行流程就好
代碼需要改的就是index.html的url和server.php的ip。
我講解幾個重要的模塊
server.php:
"127.0.0.1", "port"=>"8000", "event"=>"WSevent",//回調函數的函數名 "log"=>true, ); $websocket = new websocket($config); $websocket->run();
server.php:通過cmd運行server.php,引用并實例化websocket.class.php類庫,并執行run方法,使其充當一個"服務器",持續掛著這個連接,當客戶端有消息就做出對應動作。
Index.html:
websocket_TEST
Index.html:HTML5提供了WebSocket API,所以,客戶端實例化此API,參數為IP:端口,連接上服務端的WebSocket連接。
function roboot()
function roboot($sign,$t){ global $websocket; switch ($t) { case "hello": $show="hello,GIt @ OSC"; break; case "name": $show="Robot"; break; case "time": $show="當前時間:".date("Y-m-d H:i:s"); break; case "再見": $show="( ^_^ )/~~拜拜"; $websocket->write($sign,"Robot:".$show); $websocket->close($sign); return; break; case "天王蓋地虎": $array = array("小雞燉蘑菇","寶塔震河妖","粒粒皆辛苦"); $show = $array[rand(0,2)]; break; default: $show="( ⊙o⊙?)不懂,你可以嘗試說:hello,name,time,再見,天王蓋地虎."; } $websocket->write($sign,"Robot:".$show); }
function roboot():指定了客戶端的操作和服務端回復的信息,客戶端發送" 天王蓋地虎",服務端返回信息" 小雞燉蘑菇"/" 寶塔震河妖"/" 粒粒皆辛苦"。
文章最后來個小科普:
關于Socket 與 WebScoket
Socket 其實并不是一個協議。它工作在 OSI 模型會話層(第5層),是為了方便大家直接使用更底層協議(一般是 TCP 或 UDP )而存在的一個抽象層。
最早的一套 Socket API 是 Berkeley sockets ,采用 C 語言實現。它是 Socket 的事實標準,POSIX sockets 是基于它構建的,多種編程語言都遵循這套 API,在 JAVA、Python 中都能看到這套 API 的影子。
下面摘錄一段更容易理解的文字(來自 http和socket之長連接和短連接區別):
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。
主機 A 的應用程序要能和主機 B 的應用程序通信,必須通過 Socket 建立連接,而建立 Socket 連接必須需要底層 TCP/IP 協議來建立 TCP 連接。建立 TCP 連接需要底層 IP 協議來尋址網絡中的主機。我們知道網絡層使用的 IP 協議可以幫助我們根據 IP 地址來找到目標主機,但是一臺主機上可能運行著多個應用程序,如何才能與指定的應用程序通信就要通過 TCP 或 UPD 的地址也就是端口號來指定。這樣就可以通過一個 Socket 實例唯一代表一個主機上的一個應用程序的通信鏈路了。
而 WebSocket 則不同,它是一個完整的 應用層協議,包含一套標準的 API 。
所以,從使用上來說,WebSocket 更易用,而 Socket 更靈活。
再簡單來說, Socket是一個應用程序接口,是抽象的,WebSocket和HTTP是具體實現,
參考文章:
https://www.zhihu.com/question/20215561 《 知乎回答:什么是WebSocket?》
https://zh.wikipedia.org/wiki/WebSocket 《維基百科:WebSocket》
http://zengrong.net/post/2199.htm 《zrong"s blog》
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30351.html
摘要:本文對過去和現在流行的實時推送技術進行了比較與總結。以上我們介紹了三種實時推送技術,然而各自的缺點很明顯,使用起來并不理想,接下來我們著重介紹另一種技術它是比較理想的雙向通信技術。 前言 隨著 Web 的發展,用戶對于 Web 的實時推送要求也越來越高 ,比如,工業運行監控、Web 在線通訊、即時報價系統、在線游戲等,都需要將后臺發生的變化主動地、實時地傳送到瀏覽器端,而不需要用戶手動...
摘要:長輪循長輪循是對定時輪詢的改進和提高,目地是為了降低無效的網絡傳輸。是規范的一部分,它是一種流技術,它的規范由兩部分組成,第一個部分是服務器端與瀏覽器端之間的通訊協議,第二部分則是在瀏覽器端提供使用的對象。下一篇之客戶端與服務器端的交互二 1. 長鏈接技術介紹 說到websocket,必須講到在它之前的各種長鏈接技術,比如輪循,長輪循,sse等。長鏈接顧名思義,就是讓客戶端瀏覽器與服務...
摘要:當用戶注銷或退出時,釋放連接,清空對象中的登錄狀態。聊天管理模塊系統的核心模塊,這部分主要使用框架實現,功能包括信息文件的單條和多條發送,也支持表情發送。描述讀取完連接的消息后,對消息進行處理。 0.前言 最近一段時間在學習Netty網絡框架,又趁著計算機網絡的課程設計,決定以Netty為核心,以WebSocket為應用層通信協議做一個互聯網聊天系統,整體而言就像微信網頁版一樣,但考慮...
摘要:并且指定收到消息,以及端口的監聽方法。四代碼示例多房間實時聊天室配置版本須在里配置定義,并設置。使同一個的請求能夠落在同一個機器同一個進程中。通過主進程統一管理維護子進程,每個進程監聽一個端口。 showImg(http://7tszky.com1.z0.glb.clouddn.com/FkhApdRySR927nkdDZuUPBQbJtXG); 一、相關技術介紹: 消息實時推送,指的...
閱讀 3247·2021-09-22 15:58
閱讀 1715·2019-08-30 14:17
閱讀 1716·2019-08-28 18:05
閱讀 1504·2019-08-26 13:33
閱讀 683·2019-08-26 12:20
閱讀 605·2019-08-26 12:18
閱讀 3192·2019-08-26 11:59
閱讀 1400·2019-08-26 10:36