昨日學習了websocket的原生實例,覺得有必要把幾種常見的客戶端-服務器端無刷新交互形式列舉比較:
一、Ajax:客戶端決定何時主動向Server端發請求
如:無刷新評論、無刷新更換圖片。
主要目的是為了無刷新客戶體驗,但都是客戶端的操作來觸發向Server發送請求。
實例網上很多,原生的js或封裝了的jQurey都算比較常用、易懂、易自助修改的方式。
二、Server-sent event:定時由Server端向客戶端推送內容
如:每秒推送股市動態、每秒推送體育比賽文字轉播。
特點是客戶端只需要發送一次“來吧,請蹂躪我吧”的請求(可打開頁面就自動發送,減少用戶操作),Server就定時推送。缺點是耗流量。
原生實例可參照w3school:服務器發送事件(http://www.w3school.com.cn/html5/html_5_serversentevents.asp)
三、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頁面(可多開)
四、其他關鍵詞:SignalR(服務器推送),輪詢,Socket4Net(客戶端封裝),SuperSocket(服務器端封裝)
在學習的過程中遇到較多的其他關鍵詞,列出以備讀者拓展學習。
SignalR還沒學過,輪詢是概念理解。
Socket4Net是對Socket的客戶端封裝:http://websocket4net.codeplex.com
SuperSocket是對Socket的服務器端封裝:http://superwebsocket.codeplex.com