生活随笔
收集整理的這篇文章主要介紹了
C# Tcp客户端
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
????? ? 今天有個童鞋向我問了一下關于C#中的TCP操作,我當時給他講了一下,感覺這個東西還是需要有代碼才能講清楚。這里我只貼異步的代碼。異步看明白了,同步自然就不用多說了。
????? ? 首先我說一下我講解的代碼的思路。
????????1.【準備好服務端】既然是客戶端,那么首先我們需要一個服務端,我的服務端已經寫好,本文暫時不講服務端代碼。
????????2.【客戶端打開連接】類似于打電話一樣,要兩個手機之間打通了才能進行對話。這里我采用的是異步連接方式,代碼如下
? ?然后哦在AsynConnect方法中進行結束連接,如下圖
????? ? 3.【接收數據】既然打通了電話。那么就可以進行交流了。這里我們在連接成功插入了一段代碼,表示開始進行數據接收操作,為了在等待接收數據的時候還能有其他操作,這里使用異步方式,如下圖
這里只是開始異步讀取數據,所以我們在AsynReceiveData方法中進行結束本次數據接收。如下圖
????? ? 4.【發送數據】打電話不能一個人說話對吧,此時我們在寫了一個客戶端向服務端發送數據請求的方法。不過這里發送我是采用的同步方式,因為數據少,發送的東西又不重要,沒必要去異步。
????? ? 5.總結一下,然后貼出整個代碼。其實沒啥說的,我下面這幾行代碼初學者都能看懂。這里面有一個比較重要的思維點就是:遠程連接打開后馬上就設置了開始異步數據接收,如果不做這一步,你不會接收到服務端的數據的。簡單點,說話的方式點:就是我要開啟了異步數據接收(BeginRead)才會正常接收到數據。還有一點就是這次的數據接收結束后,還要再次開啟異步數據接收,這樣才能正常結束到下一次的數據。
????? ? 6.以下就是整個代碼部分
/// <summary>/// TcpClient操作/// </summary>public class TcpClientBusiness{#region 自定義參數/// <summary>/// Tcp客戶端模型/// </summary>private static TcpClient tcpClient;/// <summary>/// 網絡訪問數據流/// </summary>private static NetworkStream networkStream;/// <summary>/// 返回數據/// </summary>public static List<byte[]> ResponseBytes = new List<byte[]>();/// <summary>/// 遠程服務IP地址/// </summary>public static string RemoteIp = string.Empty;/// <summary>/// 遠程服務IP地址對應端口/// </summary>public static int RemotePort = -1;/// <summary>/// 是否連接/// </summary>public static bool IsConnected = false;#endregion/// <summary>/// 打開TCP連接/// </summary>public static void ConnectToServer(){try{//初始化TCP客戶端對象tcpClient = new TcpClient();//開始連接tcpClient.BeginConnect(RemoteIp, RemotePort, new AsyncCallback(AsynConnect), tcpClient);}catch (Exception ex){VerficationOperate.WriteTextLogs("TcpClientBusiness", "ConnectToServer|異常消息:" + ex.Message.ToString());}}/// <summary>/// 異步連接/// </summary>/// <param name="iar"></param>public static void AsynConnect(IAsyncResult iar){try{//連接成功tcpClient.EndConnect(iar);//連接成功標志IsConnected = true;networkStream = tcpClient.GetStream();byte[] TempBytes = new byte[1024];//開始異步讀取返回數據networkStream.BeginRead(TempBytes, 0, TempBytes.Length, new AsyncCallback(AsynReceiveData), TempBytes);}catch (Exception ex){VerficationOperate.WriteTextLogs("TcpClientBusiness", "AsynConnect|異常消息:" + ex.Message.ToString());}}/// <summary>/// 發送數據/// <param name="SendBytes">需要發送的數據</param>/// </summary>public static void SendData(byte[] SendBytes){try{if (networkStream.CanWrite && SendBytes != null && SendBytes.Length > 0){//發送數據networkStream.Write(SendBytes, 0, SendBytes.Length);networkStream.Flush();}}catch (Exception ex){if (tcpClient != null){tcpClient.Close();//關閉連接后馬上更新連接狀態標志IsConnected = false;}VerficationOperate.WriteTextLogs("TcpClientBusiness", "SendData|異常消息:" + ex.Message.ToString());}}/// <summary>/// 異步接受數據/// </summary>/// <param name="iar"></param>public static void AsynReceiveData(IAsyncResult iar){byte[] CurrentBytes = (byte[])iar.AsyncState;try{//結束了本次數據接收int num = networkStream.EndRead(iar);//這里展示結果為InfoModel的CurrBytes屬性,將返回的數據添加至返回數據容器中ResponseBytes.Add(CurrentBytes);//處理結果后馬上啟動數據異步讀取【目前我每條接收的字節數據長度不會超過1024】byte[] NewBytes = new byte[1024];networkStream.BeginRead(NewBytes, 0, NewBytes.Length, new AsyncCallback(AsynReceiveData), NewBytes);}catch (Exception ex){VerficationOperate.WriteTextLogs("TcpClientBusiness", "AsynReceiveData|異常消息:" + ex.Message.ToString());}}}
強調以下,代碼沒有測試,不過直接復制上去肯定能用,不能用你來砍我。這個僅給初學者提供參考,至于TCP服務端代碼,看看下次有空的話補上。
總結
以上是生活随笔為你收集整理的C# Tcp客户端的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。