在伺服器端使用reactor框架
使用reactor框架的伺服器端結構如下:
伺服器端註冊兩種事件處理器,clientacceptor和clientservice ,clientservice類負責和客戶端的通訊,每乙個clientservice物件對應乙個客戶端的socket連線。 clientacceptor專門負責被動接受客戶端的連線,並建立clientservice物件。這樣,在乙個n個socket連線的伺服器程式中,將存在1個clientacceptor物件和n個clientservice物件。
整個伺服器端流程如下:
首先建立乙個clientacceptor物件,該物件在reactor上註冊accept_mask事件,reactor將自動在監聽埠建立socket監聽。
如果有對該埠的socket連線時,reactor將自動**handle_input方法,clientacceptor過載此方法,並建立乙個clientservice物件,用於處理和client的通訊。
clientservice物件根據伺服器的具體功能實現,其處理過程和客戶端程式類似,註冊相應的**事件並分發即可。
**如下:
#include
#include
#include
#include
#include
class clientservice : public ace_event_handler
int open (void)
virtual ace_handle get_handle (void) const
virtual
int handle_input (ace_handle fd )
// 釋放相應資源
virtual
int handle_close (ace_handle, ace_reactor_mask mask)
protected:
char buf[100];
ace_sock_stream sock_;
};class clientacceptor : public ace_event_handler
int open (const ace_inet_addr &listen_addr)
//註冊接受連線**事件
return
this->reactor ()->register_handler(this, ace_event_handler::accept_mask);
}virtual ace_handle get_handle (void) const
virtual
int handle_input (ace_handle fd )
p.release ();
client->reactor (this->reactor ());
if (client->open () == -1)
client->handle_close (ace_invalid_handle, 0);
return 0;
}virtual
int handle_close (ace_handle handle,
ace_reactor_mask close_mask)
return 0;
}protected:
ace_sock_acceptor acceptor_;
};int main(int argc, char *argv)
return 0;
}**功能比較簡單,需要注意以下幾點:
這裡註冊事件的方式和前面的文章中方式不一樣,是通過ace_event_handler類的
reactor()方法設定和獲取reactor的指標,比較直觀和方便。前面的文章是通過ace_reactor::instance()來獲取的乙個單體reactor的指標。
當客戶端socket連線關閉時,需要釋放相應資源,需要注意一下clientservice物件的handle_close方法中釋放資源的相應**。
ACE反應器 Reactor 模式 4
定時器的實現 通過reactor機制,還可以很容易的實現定時器的功能,使用方式如下。編寫乙個事件反應器,過載 handle timeout 方法,該方法是定時器的觸發時間到時,會自動觸發該方法。通過reactor的 schedule timer 方法註冊定時器。啟動reacotr的 handle e...
ACE反應器 Reactor 模式 2
在socket程式設計中,常見的事件就是 讀就緒 寫就緒 通過對這兩個事件的捕獲分發,可以實現socket中的非同步操作。socket程式設計中的事件處理器 在前面我們已經介紹過,在ace反應器框架中,任何都必須派生自ace event handler類,並通過過載其相應會調事件處理函式來實現相應的...
ACE反應器 Reactor 模式 4
定時器的實現 通過reactor機制,還可以很容易的實現定時器的功能,使用方式如下。編寫乙個事件反應器,過載 handle timeout 方法,該方法是定時器的觸發時間到時,會自動觸發該方法。通過reactor的 schedule timer 方法註冊定時器。啟動reacotr的 handle e...