C#工做總結(一):Fleck的WebSocket使用

一.引子(Foreword)

      最近公司裏面要作窗體和網頁交互的功能。網上找了一下資料,這裏作一個簡單的擴充和整理,部份內容多是摘自其餘博客,這裏會註明出處和原文地址供你們和本身往後查閱。javascript

 

二.基礎知識(Foundation)

 

(1). WebSocket介紹html

       WebSocket協議是基於TCP的一種新的網絡協議。它實現了瀏覽器與服務器全雙工(full-duplex)通訊——容許服務器主動發送信息給客戶端。(來自白度百科前端

(2).瀏覽器對WebSocket的支持java

 

瀏覽器git

支持狀況github

Chrome谷歌瀏覽器web

Chrome version 4+支持瀏覽器

Firefox火狐瀏覽器服務器

Firefox version 5+支持websocket

IE微軟瀏覽器

IE version 10+支持(咱們通常win7自帶的是IE11)

Safari蘋果瀏覽器

IOS 5+支持

Android Brower安卓瀏覽器

Android 4.5+支持

(3). WebSocket服務器支持

 

廠商

應用服務器

備註

IBM

WebSphere

WebSphere 8.0以上版本支持,7.X以前版本結合MQTT支持相似的HTTP長鏈接

甲骨文

WebLogic

WebLogic 12c 支持,11g以及10g版本經過HTTP Publish支持相似的HTTP長鏈接

微軟

IIS

IIS 7.0+支持

Apache

Tomcat

Tomcat 7.0.5+支持

 

Jetty

Jetty 7.0+支持

(4). Web前端知識概要

<1>. 對象建立(調用WebSocket的構造函數)

  1)函數原型:     

[javascript]  view plain  copy
 
  1. Constructor(DOMString url,[DOMString protocols]);  

  2)說明:url爲WebSocket服務器的地址,protocols爲發起握手的協議名稱,爲可選擇項。

<2>. 接口及函數方法(WebSocket的接口的定義)

  1)函數原型:

[javascript]  view plain  copy
 
  1. Interface<span style="color:#333333;"> </span>WebSocket:EventTarget{  
  2.     readonly attribute DOMString url;  
  3.     //readyState狀態值  
  4.     Const unsigned short CONNECTING=0;  
  5.     Const unsigned short OPEN=1;  
  6.     Const unsigned short CLOSING=2;  
  7.     Const unsigned short CLOSED=3;  
  8.     readonly attribute unsigned short readyState;  
  9.     readonly attribute unsigned long bufferedAmount;  
  10.     //監聽網絡狀態的事件監聽器屬性  
  11.     [TreatNonCallableAsNull] attribute Function? onopen;  
  12.     [TreatNonCallableAsNull] attribute Function? onerror;  
  13.         [TreatNonCallableAsNull] attribute Function? onclose;  
  14.     readonly attribute DOMString extensions;  
  15.     readonly attribute DOMString protocol;  
  16.     //關閉網絡鏈接的方法  
  17.     void close([Clamp] optional unsigned short code,optional DOMString reason);  
  18.     //接受服務器消息的事件監聽器函數  
  19.     [TreatNonCallableAsNull] attribute Function? onmessage;  
  20.     attribute DOMString binaryType;  
  21.     void send(DOMString data);  
  22.     void send(ArrayBuffer data);  
  23.     void send(Blob data);  
  24. };  

  2)說明:

        【1】. 兩個方法:

            ● send():向遠程服務器發送數據

            ● cosle():關閉該WebSocket

        【2】. 四個重要的事件監聽器屬性:

            ● onopen:當WebSocket創建網絡鏈接的時候觸發該事件

            ● onerror:當網絡鏈接出現問題的時候觸發該事件

            ● onclose:當WebSocket被關閉的時候觸發該事件

            ● onmessage:當WebSocket接受到遠程服務器的數據的時候觸發該事件

 
                    注意:1. 上面的四個函數名均爲小寫,大小寫時敏感的;
                              2. onmessage 綁定一個型爲 function(event){…} 的函數這樣就能夠經過event.data來得到返回的數據;

 

        【3】. readyState屬性,用於返回WebSocket所處的狀態:

            ● CONNECTING(數值0):WebSocket正在嘗試與服務器創建鏈接

            ● OPEN(數值1):WebSocket與服務器已經創建鏈接

            ● CLOSING(數值2):WebSocket正在關閉與服務器的鏈接

            ● CLOSED(數值3):WebSocket已經關閉了與服務器的鏈接

 

<3>. 使用WebSocket(4步)

 

  1) 將相關的定義函數綁定到上面4個監聽事件中;

  2) 調用WebSocket的構造函數,給定一個url來初始化一個WebSocket對象;

  3) 經過send()方法來發送數據;

  4) 在有必要的時候能夠用close()來關閉監聽;

 

(4).客戶端知識概要

<1>. 梗概

        咱們能夠經過基礎的Socket通訊來實現和網頁的相互通訊。但因爲只有在.net Framework在4.5以及4.5以上的版本對WebSocket通訊的數據解析纔有相關的類來支持。因此解析數據寫起來十分的繁瑣,因此咱們使用第三方的庫來完成低版本.net框架中的通訊。若是有時間我也會寫一篇有關socket來進行通訊及解析數據的文章。

        接下來我看看用的軟件和相關的技術知識。

<2>. .Net不一樣WebSocket庫的比較

 

         我這裏找了一下網上的資料,以下連接,若是僅僅是要從網頁發送消息到服務器,那麼我這邊使用Flerk。

               ● 英文版:WebSocket libraries comparison

          ● 翻譯版:.NET的WebSocket開發包比較【已翻譯100%】

 

<3>. Fleck的源碼下載以及說明文檔

        源碼能夠從網上下載,這裏我給出連接:源碼下載

        點擊頁面中的Clone or download -> Download ZIP,以下

 

圖一

        說明文檔就在下載的下面,是英文版的的,固然也能夠看我博客中的譯文:博主翻譯版說明文檔 (以爲不錯的話轉載一下喲:-》)

一.引子(Foreword)

 

        對於怎麼使用直接看說明文檔,很是簡單,這裏博主就很少說了。(博主都寫到晚上1點了T T)

 

三.代碼(Code)

(1). Web網頁端代碼

[html]  view plain  copy
 
  1. <!DOCTYPE html>  
  2.   
  3. <html lang="en" xmlns="http://www.w3.org/1999/xhtml">  
  4. <head>  
  5.     <meta charset="utf-8" />  
  6.     <title>WebSocket測試</title>  
  7.     <style>  
  8.         .div1  
  9.         {  
  10.             height:88px;     
  11.             width:173px;  
  12.             border:1px solid blue;  
  13.             margin:auto;  
  14.         }  
  15.         h4  
  16.         {  
  17.             margin:auto;  
  18.         }  
  19.     </style>  
  20.     <script>  
  21.         var webSocket = {};  
  22.         //建立websockt  
  23.         function CreateWebSocket() {  
  24.             webSocket = new WebSocket("ws://127.0.0.1:30000");  
  25.             webSocket.onopen = WebSokectOnOpen;  
  26.             webSocket.onmessage = WebSocketOnMessage;  
  27.             webSocket.onclose = WebSocketOnClose;  
  28.         };  
  29.   
  30.         //創建鏈接事件  
  31.         function WebSokectOnOpen() {  
  32.             alert("已經打開鏈接!");  
  33.             webSocket.Send("WebSocketCreate Success!");  
  34.         };  
  35.   
  36.         //監聽事件  
  37.         function WebSocketOnMessage(event) {  
  38.             //監聽來自客戶端的數據  
  39.             alert(event.data);  
  40.         };  
  41.   
  42.         function WebSocketOnClose() {  
  43.             //監聽來自客戶端的數據  
  44.             alert('和服務器斷開鏈接');  
  45.         };  
  46.   
  47.         //發送事件  
  48.         function WebSocketSendMsg() {  
  49.             //獲取text中的值  
  50.             var text = document.getElementById("Text1").value;  
  51.             //發送到服務器  
  52.             webSocket.send(text);  
  53.         };  
  54.     </script>  
  55. </head>  
  56. <body onload="CreateWebSocket()">  
  57.     <div class="div1">  
  58.         <h4>CSDN博客</h4>  
  59.         <h4>By:LoveMiw</h4>  
  60.         <input type="text" id="Text1" />  
  61.         <input type="button" onclick="WebSocketSendMsg()" value="發送數據" />  
  62.     </div>  
  63. </body>  
  64. </html>  

(2). 服務端C#代碼

[csharp]  view plain  copy
 
  1. //上面是程序生成的using  
  2. using Fleck;  
  3.   
  4. namespace WebSocketTest  
  5. {  
  6.     class Program  
  7.     {  
  8.         static void Main(string[] args)  
  9.         {  
  10.             //客戶端url以及其對應的Socket對象字典  
  11.             IDictionary<string, IWebSocketConnection> dic_Sockets = new Dictionary<string, IWebSocketConnection>();  
  12.             //建立  
  13.   
  14.             WebSocketServer server = new WebSocketServer("ws://0.0.0.0:30000");//監聽全部的的地址  
  15.             //出錯後進行重啓  
  16.             server.RestartAfterListenError = true;  
  17.   
  18.             //開始監聽  
  19.             server.Start(socket =>  
  20.             {  
  21.                 socket.OnOpen = () =>   //鏈接創建事件  
  22.                 {  
  23.                     //獲取客戶端網頁的url  
  24.                     string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;  
  25.                     dic_Sockets.Add(clientUrl, socket);  
  26.                     Console.WriteLine(DateTime.Now.ToString() + "|服務器:和客戶端網頁:" + clientUrl + " 創建WebSock鏈接!");  
  27.                 };  
  28.                 socket.OnClose = () =>  //鏈接關閉事件  
  29.                 {  
  30.                     string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;  
  31.                     //若是存在這個客戶端,那麼對這個socket進行移除  
  32.                     if (dic_Sockets.ContainsKey(clientUrl))  
  33.                     {  
  34.                         //注:Fleck中有釋放  
  35.                         //關閉對象鏈接   
  36.                         //if (dic_Sockets[clientUrl] != null)  
  37.                         //{  
  38.                             //dic_Sockets[clientUrl].Close();  
  39.                         //}  
  40.                         dic_Sockets.Remove(clientUrl);  
  41.                     }  
  42.                     Console.WriteLine(DateTime.Now.ToString() + "|服務器:和客戶端網頁:" + clientUrl + " 斷開WebSock鏈接!");  
  43.                 };  
  44.                 socket.OnMessage = message =>  //接受客戶端網頁消息事件  
  45.                 {  
  46.                     string clientUrl = socket.ConnectionInfo.ClientIpAddress + ":" + socket.ConnectionInfo.ClientPort;  
  47.                     Console.WriteLine(DateTime.Now.ToString() + "|服務器:【收到】來客戶端網頁:" + clientUrl + "的信息:\n" + message);  
  48.                 };  
  49.             });  
  50.   
  51.             Console.ReadKey();  
  52.             foreach (var item in dic_Sockets.Values)  
  53.             {  
  54.                 if (item.IsAvailable == true)  
  55.                 {  
  56.                     item.Send("服務器消息:" + DateTime.Now.ToString());  
  57.                 }  
  58.             }  
  59.             Console.ReadKey();  
  60.   
  61.             //關閉與客戶端的全部的鏈接  
  62.             foreach (var item in dic_Sockets.Values)  
  63.             {  
  64.                 if (item != null)  
  65.                 {  
  66.                     item.Close();  
  67.                 }  
  68.             }  
  69.   
  70.             Console.ReadKey();  
  71.         }  
  72.     }  
  73. }  

 

 

四. 結束語(Ending)

(1). 在Fleck上面下載的源碼在放到工程中的時候彷佛會報錯,只要從新把全部的.cs按它原來的結構添加到一個新的工程中在編譯就能夠經過;

(2). 本文主要是用做記錄成長曆程的,還有這個WebSocket實踐性比較強,因此仍是要本身動手去試試。因此博客主因爲在時間精力不是很的狀況下就不去過多的強調代碼了。若是真的須要能夠下載我上面代碼的原工程。最後我把Fleck的包也給一下吧。

工程源代碼(環境vs2015)

Fleck源代碼

相關文章
相關標籤/搜索