利用Socket通訊

  網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。程序員

  創建網絡通訊鏈接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員作網絡開發所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通訊的能力。編程

                                                                                                                                                                                    --------來自百度百科數組

套接字:源IP地址和目的IP地址以及源端口號和目的端口號的組合。服務器

 

作Socket通訊,須要用到C#提供的一個類Socket和線程的相關知識。網絡

1、服務端socket

1.新建一個Socket實例,Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);函數

這裏的第一個參數設置網絡尋址協議(這裏用的是IP4,就是4位的IP地址),第二個參數設置數據傳輸的方法,第三個參數是傳輸控制協議。工具

2.socket.Bind(ipEndPoint);編碼

Socket綁定一個IPEndPoint,須要一個主機ip地址和端口號,由於系統佔了一些,因此設置的時候,設置的大一些。線程

IPAddress ipAddress = IPAddress.Parse("127.0.0.1".Trim());//將ip字符串轉換爲ip實例
 IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 12000);

ip地址的設置,若是設置我本地迴環地址127.0.0.1應該是隻能本地訪問,設置爲ip的話應該的局域網可訪問。

3.socket.Listen(10);開始監聽,10表示掛起的連續隊列的個數。大概意思應該是隻能有10個處於等待狀態,其他的灰被拋掉。

4.socket.Accept();;接收客戶端的鏈接,每當有用戶鏈接,就會生成一個單獨的socket負責與客戶端通訊。這個方法會返回那個代理socket對象;

5.socketProxy.Send(Encoding.UTF8.Getbytes(msg));

利用代理socket發送當心給對應的客戶端,這裏須要把數據轉換爲字節,至於編碼格式,只要客戶端和服務端一直就好了。如今通常都是用utf8;

6.socketProxy.Receive(buffer);

接受客戶端發送的數據,一樣以字節數組的方式接受到。

7.由於須要一直接受客戶端返回的信息,因此須要開啓一個線程去執行,否則主線程回卡死。

Thread thread=new Thread(receiveMsg); 參數是一個委託,能夠執行用和委託類型一直的方法代替。

具體的看須要,構造函數提供了不一樣方式的委託。

這裏須要注意的是,若是是帶參數的委託,是利用thread.Start(params);方法傳的。

這裏是一個參數Object類型的,若是須要傳遞多個參數能夠把他們封裝成一個類,由於全部的類都直接或間接的繼承自Object。

根據里氏替換原則,子類是能夠賦值給父類的,只需在方法裏再轉會子類類型就好了。

這裏還說一下前臺線程和後臺線程的區別,

程序關閉時,全部前臺線程必須執行完才能關閉,然後臺線程可隨時能夠關閉。系統給C#程序的主線程是一個前臺線程。

程序所申請的線程默認也是前臺的,能夠經過IsBackground屬性更改。

由於這裏所開啓的線程是接受數據,並且是寫了一個死循環來接受數據,因此應該後太線程。不影響程序的關閉。

2、客戶端

1.Socket client=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

參數和服務端的一致。

2.client.Connect(ip,port);鏈接服務器,這裏須要提供ip地址和端口號。

3.client.Conected屬性能夠判斷是否鏈接上服務器。

4.Thread thread=new Thread(receiveMsg);

一樣須要開啓一個線程來接受服務端的數據。同樣爲後臺線程。

5.client.Send(bytesMsg);發送數據到服務端。

6.client.Receive(bytesReceive);

 

另外:

1.ShutDown();終止發送和接受,發送給對方一個空消息。

2.close();關閉鏈接。

3.客服端和服務端都須要注意的問題,由於申請的線程執行了一個死循環函數,

由於在程序關閉以前要先將線程關閉,否則鏈接資源已經釋放了,還用socket接受數據就會引起錯誤。

thread.Abort();終止線程。

4.接受數據時,會填滿指定的字節數組,即便有些數據爲空。

5.窗體的位置Location要總體賦值,單獨的Location.X是隻讀的,緣由我還沒查到,

經過反射工具查到Location屬性上打有SettingsBindable屬性。可能和這個有關。

相關文章
相關標籤/搜索