昨日學習了websocket的原生實例,以爲有必要把幾種常見的客戶端-服務器端無刷新交互形式列舉比較:html
1、Ajax:客戶端決定什麼時候主動向Server端發請求html5
如:無刷新評論、無刷新更換圖片。web
主要目的是爲了無刷新客戶體驗,但都是客戶端的操做來觸發向Server發送請求。瀏覽器
實例網上不少,原生的js或封裝了的jQurey都算比較經常使用、易懂、易自助修改的方式。安全
2、Server-sent event:定時由Server端向客戶端推送內容服務器
如:每秒推送股市動態、每秒推送體育比賽文字轉播。websocket
特色是客戶端只須要發送一次「來吧,請蹂躪我吧」的請求(可打開頁面就自動發送,減小用戶操做),Server就定時推送。缺點是耗流量。網絡
原生實例可參照w3school:服務器發送事件(http://www.w3school.com.cn/html5/html_5_serversentevents.asp)框架
3、Socket網絡通訊:雙方平等,自由交互,我想發給你時你才須要接收socket
如:聊天場景。
特色是省流量,客戶端何時想發就發,服務器端何時想回就回,兩邊都有監聽者socket在負責。
我最初學習的是.Net Socket,是基於.net框架的網絡通訊,通常實例用的控制檯程序或WinForm來作。
昨日新接觸了WebSocket,與Net Socket主要區別是面向瀏覽器端(用web因此叫websocket),須要HTML5支持,瀏覽器大都支持(ie10以上,最新FF、Chrome都支持,據說Safari曾以爲此技術不安全暫時取消了支持),最惋惜是須要.net4.5及以上版本才能夠,即:.net4.0下是沒有System.Web.WebSocket這個命名空間(不知道另導dll有沒有用)——然而WinServer2003最多支持到.net4.0……
.net4.0下又想用web的形式、又想用socket:NetSocket作成控制檯程序,ui繼續用web(html+js)發送ws協議的請求到控制檯程序便可。
原生實例參考:Leo的(http://www.cnblogs.com/Leo_wl/archive/2013/04/12/3016063.html),文章說起了上述的形式,僅有一處筆誤:GetSecKeyAccept()方法中附加的字符串少了一個「-」(在E914以前)。應該是:byte[] encryptionString = SHA1.Create().ComputeHash(Encoding.ASCII.GetBytes(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"));
筆者也寫了一份實例demo,支持多開web對同一server進行通訊,請看筆者「在線捉鬼」系列的svn代碼:
svn地址:https://115.29.246.25/svn/Catghost/ 帳號:guest 密碼:guest
第12版本日誌:
1. 模擬服務器端:啓動NetSocketDemo.Server項目
2. 模擬客戶端:訪問Catghost.WebSocketDemo項目的Demo40.html頁面(可多開)
4、其餘關鍵詞:SignalR(服務器推送),輪詢,Socket4Net(客戶端封裝),SuperSocket(服務器端封裝)
在學習的過程當中遇到較多的其餘關鍵詞,列出以備讀者拓展學習。
SignalR還沒學過,輪詢是概念理解。
Socket4Net是對Socket的客戶端封裝:http://websocket4net.codeplex.com
SuperSocket是對Socket的服務器端封裝:http://superwebsocket.codeplex.com