C#異步傳輸字符串客戶端的實(shí)現(xiàn)
C#異步傳輸字符串客戶端的實(shí)現(xiàn)與服務(wù)端類似,我們首先對(duì)TcpClient進(jìn)行一個(gè)簡(jiǎn)單的包裝,使它的使用更加方便一些,因?yà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#異步傳輸字符串客戶端的實(shí)現(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#異步傳輸字符串客戶端的實(shí)現(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#異步傳輸字符串客戶端的實(shí)現(xiàn)
- lock (streamToServer) {
- AsyncCallback callBack =
- new AsyncCallback(ReadComplete);
- streamToServer.BeginRead(
- buffer, 0, BufferSize, callBack, null);
- }
- }
- public void SendMessage() {
- SendMessage(this.msg);
- }
- // 讀取完成時(shí)的回調(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#異步傳輸字符串客戶端的實(shí)現(xiàn)
- }
在上面的SendMessage()方法中,我們讓它連續(xù)發(fā)送了三條同樣的消息,這么僅僅是為了測(cè)試,因?yàn)楫惒讲僮魍瑯訒?huì)出現(xiàn)上面說過的:服務(wù)器將客戶端的請(qǐng)求拆開了的情況。最后我們?cè)贛ain()方法中創(chuàng)建這個(gè)類型的實(shí)例,然后調(diào)用SendMessage()方法進(jìn)行測(cè)試:
- 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);
- }
- }
是不是感覺很清爽?因?yàn)榱己玫拇a重構(gòu),使得程序在復(fù)雜程度提高的情況下依然可以在一定程度上保持良好的閱讀性。
C#異步傳輸字符串客戶端的實(shí)現(xiàn)的基本內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C#異步傳輸字符串有所幫助。
【編輯推薦】