標籤: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