C#異步傳輸字符串客戶端的實現
作者:jimmyzhang
C#異步傳輸字符串客戶端的實現是如何什么呢?C#異步傳輸字符串客戶端的實現需要注意的是什么呢?那么本文就向你介紹相關的內容。
C#異步傳輸字符串客戶端的實現與服務端類似,我們首先對TcpClient進行一個簡單的包裝,使它的使用更加方便一些,因為它是服務端的客戶,所以我們將類的名稱命名為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#異步傳輸字符串客戶端的實現
- public ServerClient() {
- try {
- client = new TcpClient();
- client.Connect("localhost", 8500);
- // 與服務器連接
- } catch (Exception ex) {
- Console.WriteLine(ex.Message);
- return;
- }
- buffer = new byte[BufferSize];
- //C#異步傳輸字符串客戶端的實現
- // 打印連接到的服務端信息
- Console.WriteLine("Server Connected!{0} --> {1}",
- client.Client.LocalEndPoint,
- client.Client.RemoteEndPoint);
- streamToServer = client.GetStream();
- }
- // 連續發送三條消息到服務端
- 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);
- // 發往服務器
- Console.WriteLine("Sent: {0}", msg);
- } catch (Exception ex) {
- Console.WriteLine(ex.Message);
- break;
- }
- }
- //C#異步傳輸字符串客戶端的實現
- lock (streamToServer) {
- AsyncCallback callBack =
- new AsyncCallback(ReadComplete);
- streamToServer.BeginRead(
- buffer, 0, BufferSize, callBack, null);
- }
- }
- public void SendMessage() {
- SendMessage(this.msg);
- }
- // 讀取完成時的回調方法
- private void ReadComplete(IAsyncResult ar) {
- int bytesRead;
- try {
- lock (streamToServer) {
- bytesRead = streamToServer.EndRead(ar);
- }
- if (bytesRead == 0) throw new
- Exception("讀取到0字節");
- 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#異步傳輸字符串客戶端的實現
- }
在上面的SendMessage()方法中,我們讓它連續發送了三條同樣的消息,這么僅僅是為了測試,因為異步操作同樣會出現上面說過的:服務器將客戶端的請求拆開了的情況。最后我們在Main()方法中創建這個類型的實例,然后調用SendMessage()方法進行測試:
- 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);
- }
- }
是不是感覺很清爽?因為良好的代碼重構,使得程序在復雜程度提高的情況下依然可以在一定程度上保持良好的閱讀性。
C#異步傳輸字符串客戶端的實現的基本內容就向你介紹到這里,希望對你了解和學習C#異步傳輸字符串有所幫助。
【編輯推薦】
責任編輯:仲衡
來源:
博客園