tcp異步機制


前面關於socket的編程,全部是基於同步機制開發的服務器和客戶端,線程會進入阻塞或者掛起狀態,降低線程利用率,同時程序影響效率。因此,向tcp程序引入異步回調:在異步套接字完成網絡操作后,線程沒有被阻塞或者掛起,接着通過調用回調函數處理后續網絡操作。而主線程繼續執行,以實現並行執行的結果。

 

為什么要引入異步機制?

看到過一個解釋。當我們打開一個程序時,鼠標不停地轉但是就是不見界面跳轉,這是其他耗時操作阻礙了ui線程,造成ui線程不能響應用戶操作。如果引用異步機制,ui線程在發起耗時操作之后馬上回來響應用戶操作,把能響應的都給用戶,最后等耗時操作結束,通過回調來處理耗時操作的結果。這就是異步機制能快速響應用戶界面,還有更高的伸縮性(線程池更加靈活分配利用數量有限的線程)

 

什么是回調函數?為什么要用回調函數?

簡而言之,回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用為調用它所指向的函數時,我們就說這是回調函數。回調常常是異步調用的基礎,即回調用於通知機制。具體看http://www.cnblogs.com/swordzj/archive/2007/04/24/2034769.html。委托就是C++的函數指針,即回調機制;就是Java的監聽器:所有提供功能待植入的機制都要用到它。

 

異步回調代碼例子如下:

sever.BeginAccept(new AsyncCallBack(Accept),server);//server是一個Socket對象

void Accept(IAsyncResult iar)

{

   Socket oldserver=(Socket)iar.AsycState;

   service=oldserver.EndAccept(iar);

}

從代碼看出,其實異步回調就是把回調函數Accept的函數地址以及函數要用到的信息的對象通知給BeginAccept,告訴BeginAccept當你執行結束的時候只要有這兩樣東西給我,你就能委托系統就能用我(Accept),而異步就體現在BeginAccept和委托函數AsyncCallBack

 

有了前面的基礎概念,就可以開始開發基於tcp的異步通信程序了。由於程序有界面還有數據通信,並且通信獲得的數據要顯示在界面上,所以應該選用回調機制來實現,它需要多線程、委托、異步調用等概念。

原文:https://blog.csdn.net/yuyin86/article/details/7765882


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM