C#異步傳輸字符串服務(wù)端的實現(xiàn)
C#異步傳輸字符串服務(wù)端的實現(xiàn)當程序越來越復(fù)雜的時候,就需要越來越高的抽象,所以從現(xiàn)在起我們不再把所有的代碼全部都扔進Main()里,這次我創(chuàng)建了一個RemoteClient類,它對于服務(wù)端獲取到的TcpClient進行了一個包裝:
C#異步傳輸字符串服務(wù)端的實現(xiàn)實例:
- public class RemoteClient {
- private TcpClient client;
- private NetworkStream streamToClient;
- private const int BufferSize = 8192;
- private byte[] buffer;
- private RequestHandler handler;
- //C#異步傳輸字符串服務(wù)端的實現(xiàn)
- public RemoteClient(TcpClient client) {
- this.client = client;
- // 打印連接到的客戶端信息
- Console.WriteLine("\nClient Connected!{0} <-- {1}",
- client.Client.LocalEndPoint,
- client.Client.RemoteEndPoint);
- // 獲得流
- streamToClient = client.GetStream();
- buffer = new byte[BufferSize];
- // 設(shè)置RequestHandler
- handler = new RequestHandler();
- // 在構(gòu)造函數(shù)中就開始準備讀取
- AsyncCallback callBack =
- new AsyncCallback(ReadComplete);
- streamToClient.BeginRead(buffer,
- 0, BufferSize, callBack, null);
- }
- // 再讀取完成時進行回調(diào)
- private void ReadComplete(IAsyncResult ar) {
- int bytesRead = 0;
- try {
- lock (streamToClient) {
- bytesRead = streamToClient.EndRead(ar);
- Console.WriteLine("Reading data, {0} bytes ...", bytesRead);
- }
- if (bytesRead == 0) throw new Exception("讀取到0字節(jié)");
- //C#異步傳輸字符串服務(wù)端的實現(xiàn)
- string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
- Array.Clear(buffer,0,buffer.Length);
- // 清空緩存,避免臟讀
- string[] msgArray = handler.GetActualString(msg);
- // 獲取實際的字符串
- // 遍歷獲得到的字符串
- foreach (string m in msgArray) {
- Console.WriteLine("Received: {0}", m);
- string back = m.ToUpper();
- // 將得到的字符串改為大寫并重新發(fā)送
- byte[] temp = Encoding.Unicode.GetBytes(back);
- streamToClient.Write(temp, 0, temp.Length);
- streamToClient.Flush();
- Console.WriteLine("Sent: {0}", back);
- } //C#異步傳輸字符串服務(wù)端的實現(xiàn)
- // 再次調(diào)用BeginRead(),完成時調(diào)用自身,形成無限循環(huán)
- lock (streamToClient) {
- AsyncCallback callBack =
- new AsyncCallback(ReadComplete);
- streamToClient.BeginRead(buffer,
- 0, BufferSize, callBack, null);
- }
- } catch(Exception ex) {
- if(streamToClient!=null)
- streamToClient.Dispose();
- client.Close();
- Console.WriteLine(ex.Message);
- // 捕獲異常時退出程序
- }
- }
- }
隨后,我們在主程序中僅僅創(chuàng)建TcpListener類型實例,由于RemoteClient類在構(gòu)造函數(shù)中已經(jīng)完成了初始化的工作,所以我們在下面的while循環(huán)中我們甚至不需要調(diào)用任何方法:
- class Server {
- static void Main(string[] args) {
- Console.WriteLine("Server is running ... ");
- IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
- TcpListener listener = new TcpListener(ip, 8500);
- listener.Start(); // 開始偵聽
- Console.WriteLine("Start Listening ...");
- while (true) {
- // 獲取一個連接,同步方法,在此處中斷
- TcpClient client = listener.AcceptTcpClient();
- RemoteClient wapper = new RemoteClient(client);
- }
- } //C#異步傳輸字符串服務(wù)端的實現(xiàn)
- }
好了,服務(wù)端的實現(xiàn)現(xiàn)在就完成了。
C#異步傳輸字符串服務(wù)端的實現(xiàn)方面內(nèi)容就向你介紹到這里,希望對你了解和學(xué)習C#異步傳輸字符串有所幫助。
【編輯推薦】