c#實現服務端webSocket

來源:互聯網
上載者:User

標籤:put   exp   odi   ssi   綁定ip   目標   方法   line   .sh   

現階段socket通訊使用TCP、UDP協議,其中TCP協議相對來說比較安全穩定!本文也是來講解TCP為主(恕在下學藝不精)。

        

下面是個人理解的tcp/ip進行通訊之間的三向交握!

1.用戶端先發送報文到服務端

2.服務端接受到報文之後進行回複

3.用戶端收到回複之後再次發送確認資訊。這個時候才是正式進行串連。

首先說一下串連形式:

      伺服器監聽:伺服器開啟服務之後,就進入了監聽用戶端串連狀態。此時不是指定監聽那台用戶端那是處於一個等待狀態(不是暫停,一直處於網路即時監聽),等待用戶端找他進行串連。

       用戶端串連:用戶端對目標伺服器發起連結請求,發起請求必須要知道IP以及相應連接埠號碼。

       確認連結:這個時候服務端的監聽就起作用了,受到用戶端的請求後會響應用戶端請求,建立socket連結。在這裡需要注意連結不是一對一的,服務端會重新對請求用戶端建立新的socket服務。所以服務端仍處於監聽狀態仍可以監聽。

好了以上就是一些基本介紹,主要是為了一下的東西做鋪墊,畢竟要實現需要有socket的基礎,言歸正傳。下面開始我們完整的webSocket練習吧!(網上有些使用外掛程式或者類庫實現的websocket。但是我們所講的是以socket為基礎的)

 

別的不多少首先建立socket伺服器:

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Net.Sockets; 7 using System.Net; 8 using System.Threading; 9 using System.Text.RegularExpressions;10 using System.Security.Cryptography;11 12 namespace SocketService13 {14     class SocketService15     {16         private static byte[] result = new byte[1024];17         private static int myProt = 8885;   //連接埠  18         static Socket serverSocket;  //伺服器服務19         public void Start()20         {21             //伺服器IP地址  22             IPAddress ip = IPAddress.Parse("127.0.0.1");23             //socket的建構函式進行服務註冊24             serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);25             //綁定IP地址:連接埠  26             serverSocket.Bind(new IPEndPoint(ip, myProt));27             //設定最多10個排隊串連請求 28             serverSocket.Listen(10);29             Console.WriteLine("啟動監聽{0}成功", serverSocket.LocalEndPoint.ToString());30             //通過Clientsoket發送資料  31             Thread myThread = new Thread(ListenClientConnect);32             myThread.Start();33             Console.ReadLine();34         }35         /// <summary>  36         /// 監聽用戶端串連  37         /// </summary>  38         private  void ListenClientConnect()39         {40             while (true)41             {42                 Socket clientSocket = serverSocket.Accept();43                // clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));44                 Thread receiveThread = new Thread(ReceiveMessage);45                 receiveThread.Start(clientSocket);46             }47         }48 49         /// <summary>  50         /// 接收訊息  51         /// </summary>  52         /// <param name="clientSocket"></param>  53         private  void ReceiveMessage(object clientSocket)54         {55             Socket myClientSocket = (Socket)clientSocket;56             while (true)57             {58                 try59                 {60                     //通過clientSocket接收資料  61                     int receiveNumber = myClientSocket.Receive(result);62                     //  websocket建立串連的時候,除了TCP串連的三向交握,websocket協議中用戶端與伺服器想建立串連需要一次額外的握手動作63                     string msg = Encoding.UTF8.GetString(result, 0, receiveNumber);64                     var buffer = result;65                     if (msg.Contains("Sec-WebSocket-Key"))66                     {67 68                         myClientSocket.Send(PackageHandShakeData(buffer, receiveNumber));69 70                        // return;71                     }72                     var ss = AnalyzeClientData(result, receiveNumber);73                     Console.WriteLine("接收用戶端{0}訊息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));74                 }75                 catch (Exception ex)76                 {77                     Console.WriteLine(ex.Message);78                     myClientSocket.Shutdown(SocketShutdown.Both);79                     myClientSocket.Close();80                     break;81                 }82             }83         }84  }85 }
View Code

 代碼注釋我已經寫的很詳細了!希望你們能看懂(哈哈)!

 看到這裡有些聰明的網友可能發現問題了!或者操作過但是沒有成功的也看出了不同。沒有錯,在這裡我要說明的一點是有些websocket與socket有點不同的就是他的握手的首次資訊以及返回資訊是需要特定格式的。

也就是所謂的回應標頭域需要特殊處理。在不做相對應的響應處理瀏覽器會報“握手不成功”的錯誤!

參考網址:http://www.cnblogs.com/smark/archive/2012/11/26/2789812.html 

如果初步同學沒有看明白請移至另一篇部落格,詳細封裝了此方法解決此錯誤。(方便有些同學尋找錯誤找不到解決方案,因為鄙人也是搞了一上午才有幸發現此問題,還望海涵)

最後我們只需要在主方法進行調用開啟服務

此時服務端代碼大功告成!下面我們使用js來進行請求就可以了。

下面附送html建議代碼也可以去w3c查看教程:

html代碼:

    <body>        <a href="javascript:WebSocketTest()">運行 WebSocket</a>        <a href="javascript:webSocketClose()">關閉WebSocket</a>        <div id="look" class="m">        </div>        <input id="message">        <a href="javascript:send()">發送訊息</a>    </body>

javascript代碼:

var ws;function WebSocketTest() {    if("WebSocket" in window) {        alert("您的瀏覽器支援 WebSocket!");        // 開啟一個 web socket        ws = new WebSocket("ws://127.0.0.1:8885");        ws.onopen = function() {            // Web Socket 已串連上,使用 send() 方法發送資料            ws.send("發送資料");            alert("資料發送中...");        };        ws.onmessage = function(evt) {            var received_msg = evt.data;            document.getElementById("look").html+=received_msg;            alert("資料已接收...");        };        ws.onclose = function() {            // 關閉 websocket            alert("串連已關閉...");        };    } else {        // 瀏覽器不支援 WebSocket        alert("您的瀏覽器不支援 WebSocket!");    }}function webSocketClose() {ws.close();alert("關閉了通訊")}function send(){    var msg= document.getElementById("message").value;    if(msg==""||msg==undefined){        alert("請填寫發送內容!")        return;    }    ws.send("1111111111");    alert("發送了訊息")}
View Code

最後附上運行:

 

 

 

 

 

 

 

      

c#實現服務端webSocket

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.