利用boost::asio实现一个简单的服务器框架

利用boost::asio实现一个简单的服务器框架

  boost::asio是一个高性能的网络开发库,Windows下使用IOCP,Linux下使用epoll。与ACE不同的是,它并没有提供一个网络框架,而是采取组件的方式来提供应用接口。但是对于常见的情况,采用一个好用的框架还是能够简化开发过程,特别是asio的各个异步接口的用法都相当类似。
  受到  SP Server 框架的影响,我使用asio大致实现了一个多线程的半异步半同步服务器框架,以下是利用它来实现一个Echo服务器:

1. 实现回调:
static   void  onSessionStarted(RequestPtr  const & request, ResponsePtr const& response) {
       request
->setReadMode(Session::READ_LN); // 设置为行读取
}


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

说明:close()是一个关闭请求,它并不马上关闭Session,而是等待所有与该Session相关的异步操作全部结束后才关闭。

2. 一个单线程的Echo服务器:
void  server_main() {
    unsigned short port = 7;

    AsioService svc;
    AsioTcpServer tcp(
svc, port );

   
svc.callbacks(). sessionStarted  =   & onSessionStarted;
   
svc.callbacks() .sessionHandle  =   & onSession;

    svc.run();
}


3. 一个多线程的Echo服务器(半异步半同步:一个主线程,4个工作者线程)
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 ( );
}

  有了这样一个思路,实现起来就很容易了。重点是以下两点:
  1。缓冲区的管理与内存池的使用
  2。为了保证Session的线程安全,必须要设置一个挂起状态。
         
    还有一个好处,就是完全隔绝了asio的应用接口,不用再忍受asio漫长的编译时间了。代码就不贴在这里了,有兴趣的可以通过email 探讨。(说明,这里只提出一个思路,不再提供源代码,请各位见谅)

  原文地址:  http://www.cppblog.com/eXile/

   



你可能感兴趣的:(利用boost::asio实现一个简单的服务器框架)