WCF和TCP應用編程

TCP應用編程概述

TCP的特點

1️⃣概念
TCP是Transmission Control Protocol(傳輸控制協議)的簡稱,是TCP/IP體系中面向連接的運輸層協議,在網絡中提供雙工和可靠的服務
2️⃣特點
一對一通信。
安全順序傳輸。
通過字節流收發數據。
傳輸的數據無消息邊界
(TCP是將數據組裝爲多個數據報以字節流的形式進行傳輸,因此可能會出現發送方單次發送的消息與接收方單次接收的消息不一致的現象)

TCP應用編程的技術選擇

編寫TCP應用程序的技術包含:
1.用Socket類實現
(1)TCP通信過程中的所有細節全部通過自己編寫的程序來控制。
(2)特點:方式靈活,但需要程序員編寫的代碼多。
(3)建議:定義一些新的協議或者對底層的細節進行更靈活的控制時使用此技術。
2.用TcpClient和TcpListener以及多線程實現
(1)TcpClient和TcpListener類對Socket進一步封裝後的類,在一定程度上簡化了用Socket編寫TCP程序的難度,但靈活性也受到一定的限制。
(2)特點:TCP數據傳輸過程中的監聽和通信細節(比如消息邊界問題)仍然需要程序員自己通過代碼去解決。
3. 用TcpClient和TcpListener以及多任務實現
(1)編寫TCP應用程序時,不需要開發人員考慮多線程創建、管理以及負載平衡等實現細節,只需要將多線程看作是多個任務來實現即可。
4.用WCF實現
(1)監聽和無消息邊界等問題均有WCF內部自動完成。
(2)程序員只需要考慮傳輸過程中的業務邏輯即可。另外,利用WCF還可以實現自定義的協議。

在.NET框架4.0及更高版本中,第3種和第4種是建議的做法。在.NET框架3.5及更低版本中,只能用第1種和第2種方式實現。

利用傳統技術實現TCP應用編程

TcpClient類和TcpListener類

①TcpListener類用於監聽客戶端連接請求。
②TcpClient類用於提供本地主機和遠程主機的連接信息。

TcpClient類

(1)位於System.Net.Sockets命名空間下。
(2)提供的構造函數主要用 於客戶端編程,而服務器端程序是通過TcpListener對象的AcceptTcpClient方法得到TcpClient對象的,不需要在服務端創建對象。
TcpClient的構造函數有以下重載形式。
TcpClient( )
(1)用不帶參數的構造函數創建TcpClient對象時,系統會自動分配IP地址和端口號,例如:
TcpClient tcpClient=new TcpClient( );
tcpClient.Connect(“www.abcd.com”, 51888);
TcpClient(string hostname,int port)
(1)自動爲客戶端分配IP地址和端口號,並自動與遠程主機建立連接。
(2)例如:
TcpClient tcpClient = new TcpClient(“www.abcd.com”, 51888);
TcpClient(AddressFamily family)
(1)這種構造函數創建的TcpClient對象也能自動分配本地IP地址和端口號,但是它使用AddressFamily枚舉指定使用哪種網絡協議(IPv4或者IPv6)。
(2)例如:

TcpClient tcpClient = new   TcpClient(AddressFamily.InterNetwork);
tcpClient.Connect("www.abcd.com", 51888);

TcpClient(IPEndPoint iep)
(1)該構造函數的參數iep用於指定本機(客戶端)IP地址與端口號。當客戶端有一個以上的IP地址時,如果程序員希望指定IP地址和端口號,可以使用這種方式。
(2)例如:

IPAddress[] address = Dns.GetHostAddresses(Dns.GetHostName( ));
IPEndPoint iep = new IPEndPoint(address[0], 51888);
TcpClient tcpClient = new TcpClient(iep);
tcpClient.Connect("www.abcd.com", 51888);

TcpListener類

①TcpListener類用於在服務端監聽和接收客戶端傳入的連接請求。
該類的構造函數常用的有以下兩種重載形式。
TcpListener(IPEndPoint iep)
(1)通過IPEndPoint類型的對象在指定的IP地址與端口監聽客戶端連接請求,iep包含了本機的IP地址與端口號。
TcpListener(IPAddress localAddr, int port)
(1)直接指定本機IP地址和端口,並通過指定的本機IP地址和端口監聽客戶端傳入的連接請求。
在同步工作方式下,對應有Start方法、Stop方法、AcceptSocket方法和AcceptTcpClient方法。另外,與這些同步方法對應的異步方法都有Async後綴。
(1)Start方法
TcpListener對象的Start方法用於啓動監聽。
public void Start( )
public void Start(int backlog)
(2)Stop方法
TcpListener對象的Stop方法用於關閉TcpListener並停止監聽請求,語法如下。
public void Stop( )
(3)AcceptTcpClient方法
用於在同步阻塞方式下獲取並返回一個封裝了Socket的TcpClient對象,同時從傳入的連接隊列中移除該客戶端的連接請求。得到該對象後,就可以通過該對象的GetStream方法生成NetworkStream對象,再利用NetworkStream對象與客戶端通信。
(4)AcceptSocket方法
用於在同步阻塞方式下獲取並返回一個用來接收和發送數據的Socket對象,同時從傳入的連接隊列中移除該客戶端的連接請求。

簡單應用只需要調用AcceptTcpClient,如果需要更細化的行爲控制,則用AcceptSocket來實現。

用TcpListener和TcpClient編寫TCP應用程序的一般步驟

編寫TCP服務端代碼的一般步驟
1)創建一個TcpListener對象,然後調用該對象的Start方法在指定的端口進行監聽。
2)在單獨的線程中,循環調用TcpListener對象的AcceptTcpClient方法接收客戶端連接請求,並根據該方法返回的結果得到與該客戶端對應的TcpClient對象。
3)每得到一個新的TcpClient對象,就創建一個與該客戶端對應的線程,然後通過該線程與對應的客戶端通信。
4)根據傳送信息的情況確定是否關閉與客戶端的連接。
編寫TCP客戶端代碼的一般步驟
1)利用TcpClient的構造函數創建一個TcpClient對象,並利用該對象與服務端建立連接。
2)利用TcpClient對象的GetStream方法得到網絡流,然後利用該網絡流與服務端進行數據傳輸。
3)創建一個線程監聽指定的端口,循環接收並處理服務端發送過來的信息。
4)完成通信工作後,向服務端發送關閉信息,並關閉與服務器的連接。
在這裏插入圖片描述

解決TCP無消息邊界問題的辦法

(1)發送固定長度的消息
這種辦法適用於消息長度固定的場合。
(2)將消息長度與消息一起發送
一般在每次發送的消息前面用4個字節表明本次消息的長度,然後將其和消息一起發送到對方;對方接收到消息後,首先從前4個字節獲取實際的消息長度,再根據消息長度值依次接收發送方發送的數據。
這種辦法適用於任何場合。
(3)使用特殊標記分隔消息
使用特殊分隔符對消息進行分隔。
這種辦法主要用於消息本身不包含特殊標記的場合。

利用WCF實現TCP應用編程

WCF與TCP相關的綁定

利用WCF編寫TCP應用程序時,只需要在服務端配置文件中設置相關的綁定,就可以輕鬆實現相應的功能,而且不容易出錯。

NetTcpBinding

(1)NetTcpBinding類用於將WCF和TCP綁定在一起,並以服務的形式提供TCP服務端和客戶端之間的通信。
(2)在服務端配置文件中,用元素來配置。
在服務端配置文件中,元素默認配置如下:
安全模式:Transport(保證傳輸安全)。
消息編碼方式:Binary(採用二進制消息編碼器)。
傳輸協議:TCP。
會話:提供傳輸會話(也可以配置爲可靠對話)。
事務:無事務處理功能(也可以配置爲支持事務處理)。
雙工:支持。

其他與TCP相關的綁定

(1)除了NetTcpBinding以外,WCF與TCP相關的綁定還有MexTcpBinding、NetTcpContextBinding
(2)WCF有一個約定:凡是具有Net前綴的綁定默認都使用二進制編碼器對消息進行編碼,而不帶Net前綴的綁定則默認使用文本消息編碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章