C#異步傳輸字符串服務端的實現
作者:jimmyzhang
C#異步傳輸字符串服務端的實現是如何的呢?C#異步傳輸字符串服務端的實現的實例具體的操作是什么呢?那么本文就向你介紹這方面的內容。
C#異步傳輸字符串服務端的實現當程序越來越復雜的時候,就需要越來越高的抽象,所以從現在起我們不再把所有的代碼全部都扔進Main()里,這次我創建了一個RemoteClient類,它對于服務端獲取到的TcpClient進行了一個包裝:
C#異步傳輸字符串服務端的實現實例:
- public class RemoteClient {
- private TcpClient client;
- private NetworkStream streamToClient;
- private const int BufferSize = 8192;
- private byte[] buffer;
- private RequestHandler handler;
- //C#異步傳輸字符串服務端的實現
- 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];
- // 設置RequestHandler
- handler = new RequestHandler();
- // 在構造函數中就開始準備讀取
- AsyncCallback callBack =
- new AsyncCallback(ReadComplete);
- streamToClient.BeginRead(buffer,
- 0, BufferSize, callBack, null);
- }
- // 再讀取完成時進行回調
- 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字節");
- //C#異步傳輸字符串服務端的實現
- 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();
- // 將得到的字符串改為大寫并重新發送
- byte[] temp = Encoding.Unicode.GetBytes(back);
- streamToClient.Write(temp, 0, temp.Length);
- streamToClient.Flush();
- Console.WriteLine("Sent: {0}", back);
- } //C#異步傳輸字符串服務端的實現
- // 再次調用BeginRead(),完成時調用自身,形成無限循環
- 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);
- // 捕獲異常時退出程序
- }
- }
- }
隨后,我們在主程序中僅僅創建TcpListener類型實例,由于RemoteClient類在構造函數中已經完成了初始化的工作,所以我們在下面的while循環中我們甚至不需要調用任何方法:
- 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#異步傳輸字符串服務端的實現
- }
好了,服務端的實現現在就完成了。
C#異步傳輸字符串服務端的實現方面內容就向你介紹到這里,希望對你了解和學習C#異步傳輸字符串有所幫助。
【編輯推薦】
責任編輯:仲衡
來源:
博客園

















