異步TCP和同步TCP類似,和其他所有的異步調用一樣:
幾個基本的異步調用.
AsyncCallback委托
AsyncCallback委托用於引用異步操作完成時調用的回調方法。在異步操作方式下,由於程序可以在啟動異步操作后繼續執行其他代碼,因此必須有一種機制,以保證該異步操作完成時能及時通知調用者。這種機制可以通過AsyncCallback委托實現。
異步操作的每一個方法都有一個Begin…方法和End…方法,例如BeginAcceptTcpClient和EndAcceptTcpClient。程序調用Begin…方法時,系統會自動在線程池中創建對應的線程進行異步操作,從而保證調用方和被調用方同時執行,當線程池中的Begin…方法執行完畢時,會自動通過AsyncCallback委托調用在Begin…方法的參數中指定的回調方法。
回調方法是在程序中事先定義的,在回調方法中,通過End…方法獲取Begin…方法的返回值和所有輸入/輸出參數,從而達到異步操作方式下完成參數傳遞的目的。
BeginAcceptTcpClient方法和EndAcceptTcpClient方法
BeginAcceptTcpClient和EndAcceptTcpClient方法包含在System.Net.Sockets命名空間下的TcpListener類中。在異步TCP應用編程中,服務器端可以使用TcpListener類提供的BeginAcceptTcpClient方法開始接收新的客戶端連接請求。在這個方法中,系統自動利用線程池創建需要的線程,並在操作完成時利用異步回調機制調用提供給它的方法,同時返回相應的狀態參數,其方法原型為:
public IAsyncResult BeginAcceptTcpClient(AsyncCallback callback, Object state)
其中:參數1為AsyncCallback類型的委托;參數2為Object類型,用於將狀態信息傳遞給委托提供的方法。例如:
AsyncCallback callback = new AsyncCallback(AcceptTcpClientCallback);
tcpListener.BeginAcceptTcpClient(callback, tcpListener);
程序執行BeginAcceptTcpClient方法后,即在線程池中自動創建需要的線程,同時在自動創建的線程中監聽客戶端連接請求。一旦接受了客戶連接請求,就自動通過委托調用提供給委托的方法,並返回狀態信息。這里我們給委托自動調用的方法命名為AcceptTcpClientCallback,狀態信息定義為TcpListener類型的實例tcpListener。在程序中,定義該方法的格式為:
void AcceptTcpClientCallback( IAsyncResult ar)
{
回調代碼
}
方法中傳遞的參數只有一個,而且必須是IAsyncResult類型的接口,它表示異步操作的狀態。由於我們定義了委托提供的方法(即AcceptTcpClientCallback方法),因此系統會自動將該狀態信息從關聯的BeginAcceptTcpClient方法傳遞到AcceptTcpClientCallback方法。注意在回調代碼中,必須調用EndAcceptTcpClient方法完成客戶端連接。關鍵代碼為:
void AcceptTcpClientCallback( IAsyncResult ar)
{
……
TcpListener myListener = (TcpListener)ar.AsyncState;
TcpClient client = myListener.EndAcceptTcpClient(ar);
……
}
程序執行EndAcceptTcpClient方法后,會自動完成客戶端連接請求,並返回包含底層套接字的TcpClient對象,接下來我們就可以利用這個對象與客戶端進行通信了。
默認情況下,程序執行BeginAcceptTcpClient方法后,在該方法返回狀態信息之前,不會像同步TCP方式那樣阻塞等待客戶端連接,而是繼續往下執行。如果我們希望在其返回狀態信息之前阻塞當前線程的執行,可以調用ManualResetEvent對象的WaitOne方法。
BeginConnect方法和EndConnect方法
AsyncCallback requestCallback = new AsyncCallback(RequestCallback);
tcpClient.BeginConnect(遠程主機IP或域名,遠程主機端口號 , requestCallback, tcpClient);
……
void RequestCallback(IAsyncResult ar)
{
……
tcpClient = (TcpClient)ar.AsyncState;
client.EndConnect(ar);
……
}
發送數據 在異步TCP應用編程中,如果本機已經和遠程主機建立連接,就可以用System.Net.Sockets命名空間下NetworkStream類中的BeginWrite方法發送數據。其方法原型為:
public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, Object state);
異步TCP---簡單聊天例子/Files/fujinliang/AsyncTcpServer.rar