boost::asio是一個(gè)高性能的網(wǎng)絡(luò)開發(fā)庫(kù),Windows下使用IOCP,Linux下使用epoll。與ACE不同的是,它并沒(méi)有提供一個(gè)網(wǎng)絡(luò)框架,而是采取組件的方式來(lái)提供應(yīng)用接口。但是對(duì)于常見的情況,采用一個(gè)好用的框架還是能夠簡(jiǎn)化開發(fā)過(guò)程,特別是asio的各個(gè)異步接口的用法都相當(dāng)類似。
受到
SP Server 框架的影響,我使用asio大致實(shí)現(xiàn)了一個(gè)多線程的半異步半同步服務(wù)器框架,以下是利用它來(lái)實(shí)現(xiàn)一個(gè)Echo服務(wù)器:
1. 實(shí)現(xiàn)回調(diào):
static void onSessionStarted(RequestPtr const& request, ResponsePtr const& response) {
request->setReadMode(Session::READ_LN); // 設(shè)置為行讀取
}

static void onSession(RequestPtr const& request, ResponsePtr const& response) {
print(request->message()); //打印收到的消息
response->addReply(request->message()); //回送消息
response->close();
}

說(shuō)明:close()是一個(gè)關(guān)閉請(qǐng)求,它并不馬上關(guān)閉Session,而是等待所有與該Session相關(guān)的異步操作全部結(jié)束后才關(guān)閉。
2. 一個(gè)單線程的Echo服務(wù)器:
void server_main() {
unsigned short port = 7;
AsioService svc;
AsioTcpServer tcp(svc, port);
svc.callbacks().sessionStarted = &onSessionStarted;
svc.callbacks().sessionHandle = &onSession;
svc.run();
}
3. 一個(gè)多線程的Echo服務(wù)器(半異步半同步:一個(gè)主線程,4個(gè)工作者線程)
void server_main2() {
unsigned short port = 7;
int num_threads = 4;
AsioService svc;
AsioService worker(AsioService::HAS_WORK);
AsioTcpServer tcp(svc, port);
svc.callbacks().sessionStarted = worker.wrap(&onSessionStarted);
svc.callbacks().sessionHandle = worker.wrap(&onSession);
AsioThreadPool thr(worker, num_threads);
svc.run();
}
有了這樣一個(gè)思路,實(shí)現(xiàn)起來(lái)就很容易了。重點(diǎn)是以下兩點(diǎn):
1。緩沖區(qū)的管理與內(nèi)存池的使用
2。為了保證Session的線程安全,必須要設(shè)置一個(gè)掛起狀態(tài)。
還有一個(gè)好處,就是完全隔絕了asio的應(yīng)用接口,不用再忍受asio漫長(zhǎng)的編譯時(shí)間了。代碼就不貼在這里了,有興趣的可以通過(guò)email 探討。(說(shuō)明,這里只提出一個(gè)思路,不再提供源代碼,請(qǐng)各位見諒)
原文地址:
http://m.shnenglu.com/eXile/