C#異步傳輸字符串服務(wù)端的實(shí)現(xiàn)
C#異步傳輸字符串服務(wù)端的實(shí)現(xiàn)當(dāng)程序越來越復(fù)雜的時(shí)候,就需要越來越高的抽象,所以從現(xiàn)在起我們不再把所有的代碼全部都扔進(jìn)Main()里,這次我創(chuàng)建了一個(gè)RemoteClient類,它對(duì)于服務(wù)端獲取到的TcpClient進(jìn)行了一個(gè)包裝:
C#異步傳輸字符串服務(wù)端的實(shí)現(xiàn)實(shí)例:
- public class RemoteClient {
- private TcpClient client;
- private NetworkStream streamToClient;
- private const int BufferSize = 8192;
- private byte[] buffer;
- private RequestHandler handler;
- //C#異步傳輸字符串服務(wù)端的實(shí)現(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ù)中就開始準(zhǔn)備讀取
- AsyncCallback callBack =
- new AsyncCallback(ReadComplete);
- streamToClient.BeginRead(buffer,
- 0, BufferSize, callBack, null);
- }
- // 再讀取完成時(shí)進(jìn)行回調(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ù)端的實(shí)現(xiàn)
- string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
- Array.Clear(buffer,0,buffer.Length);
- // 清空緩存,避免臟讀
- string[] msgArray = handler.GetActualString(msg);
- // 獲取實(shí)際的字符串
- // 遍歷獲得到的字符串
- 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ù)端的實(shí)現(xiàn)
- // 再次調(diào)用BeginRead(),完成時(shí)調(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);
- // 捕獲異常時(shí)退出程序
- }
- }
- }
隨后,我們?cè)谥鞒绦蛑袃H僅創(chuàng)建TcpListener類型實(shí)例,由于RemoteClient類在構(gòu)造函數(shù)中已經(jīng)完成了初始化的工作,所以我們?cè)谙旅娴膚hile循環(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) {
- // 獲取一個(gè)連接,同步方法,在此處中斷
- TcpClient client = listener.AcceptTcpClient();
- RemoteClient wapper = new RemoteClient(client);
- }
- } //C#異步傳輸字符串服務(wù)端的實(shí)現(xiàn)
- }
好了,服務(wù)端的實(shí)現(xiàn)現(xiàn)在就完成了。
C#異步傳輸字符串服務(wù)端的實(shí)現(xiàn)方面內(nèi)容就向你介紹到這里,希望對(duì)你了解和學(xué)習(xí)C#異步傳輸字符串有所幫助。
【編輯推薦】