溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中怎么實現(xiàn)一個異步傳輸字符串客戶端

發(fā)布時間:2021-07-08 14:28:29 來源:億速云 閱讀:126 作者:Leah 欄目:編程語言

這篇文章給大家介紹C#中怎么實現(xiàn)一個異步傳輸字符串客戶端,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

C#異步傳輸字符串客戶端的實現(xiàn)與服務(wù)端類似,我們首先對TcpClient進(jìn)行一個簡單的包裝,使它的使用更加方便一些,因為它是服務(wù)端的客戶,所以我們將類的名稱命名為ServerClient:

public class ServerClient {  private const int BufferSize = 8192;  private byte[] buffer;  private TcpClient client;  private NetworkStream streamToServer;  private string msg = "Welcome to TraceFact.Net!";   //C#異步傳輸字符串客戶端的實現(xiàn)public ServerClient() {  try {  client = new TcpClient();  client.Connect("localhost", 8500);    // 與服務(wù)器連接  } catch (Exception ex) {  Console.WriteLine(ex.Message);  return;  }  buffer = new byte[BufferSize];   //C#異步傳輸字符串客戶端的實現(xiàn)// 打印連接到的服務(wù)端信息  Console.WriteLine("Server Connected!{0} --> {1}",  client.Client.LocalEndPoint,   client.Client.RemoteEndPoint);   streamToServer = client.GetStream();  }   // 連續(xù)發(fā)送三條消息到服務(wù)端  public void SendMessage(string msg) {   msg = String.Format("[length={0}]{1}",   msg.Length, msg);   for (int i = 0; i <= 2; i++) {  byte[] temp = Encoding.Unicode.GetBytes(msg);     // 獲得緩存  try {  streamToServer.Write(temp, 0, temp.Length);   // 發(fā)往服務(wù)器  Console.WriteLine("Sent: {0}", msg);  } catch (Exception ex) {  Console.WriteLine(ex.Message);  break;  }  }   //C#異步傳輸字符串客戶端的實現(xiàn)lock (streamToServer) {  AsyncCallback callBack =   new AsyncCallback(ReadComplete);  streamToServer.BeginRead(  buffer, 0, BufferSize, callBack, null);  }  }   public void SendMessage() {  SendMessage(this.msg);  }   // 讀取完成時的回調(diào)方法  private void ReadComplete(IAsyncResult ar) {  int bytesRead;   try {  lock (streamToServer) {  bytesRead = streamToServer.EndRead(ar);  }  if (bytesRead == 0) throw new  Exception("讀取到0字節(jié)");   string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);  Console.WriteLine("Received: {0}", msg);  Array.Clear(buffer, 0, buffer.Length);    // 清空緩存,避免臟讀   lock (streamToServer) {  AsyncCallback callBack =   new AsyncCallback(ReadComplete);  streamToServer.BeginRead(buffer,   0, BufferSize, callBack, null);  }  } catch (Exception ex) {   if(streamToServer!=null)  streamToServer.Dispose();  client.Close();   Console.WriteLine(ex.Message);  }  }  //C#異步傳輸字符串客戶端的實現(xiàn)}

在上面的SendMessage()方法中,我們讓它連續(xù)發(fā)送了三條同樣的消息,這么僅僅是為了測試,因為異步操作同樣會出現(xiàn)上面說過的:服務(wù)器將客戶端的請求拆開了的情況。最后我們在Main()方法中創(chuàng)建這個類型的實例,然后調(diào)用SendMessage()方法進(jìn)行測試:

class Client {  static void Main(string[] args) {  ConsoleKey key;   ServerClient client = new ServerClient();  client.SendMessage();   Console.WriteLine("\n\n輸入\"Q\"鍵退出。");  do {  key = Console.ReadKey(true).Key;  } while (key != ConsoleKey.Q);  }  }

關(guān)于C#中怎么實現(xiàn)一個異步傳輸字符串客戶端就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI