eXile 的专栏

利用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/

   




posted on 2008-05-28 21:00 eXile 阅读(8935) 评论(13)  编辑 收藏 引用 所属分类: C/C++网络开发

评论

# re: 利用boost::asio实现一个简单的服务器框架 2008-05-29 20:16 森林

森林来访www.hanvc.com  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2008-05-29 20:25 haskell

如何隔离的?能否解释清楚  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2008-05-30 10:22 eXile

@haskell
无非就是不透明指针或者虚函数  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2008-06-04 17:42 accesine

好,邮件交流
  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2008-10-10 14:53 宣圣

我正在用asio作服务器程序。但很多问题没考虑好,比如发送是否需建个数据报连标。  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架[未登录] 2009-06-18 10:12

hi 你好,我现在也在学习ASIO 感觉实际应用的资料比较少 看到了你写的这片BLOG想知道可不可以用多线程在一个io_service上进行RUN,和在多个io_service上进行RUN的差别是什么,需要注意哪些,另外如果可以的话希望能帮忙把这个BLOG的代码发给我 非常感谢 liflag888@126.com  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2009-06-18 20:44 xqk

HI, 源代码 给我一份好吗? sock5@sina.com  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2009-07-14 15:05

源代码给我一份好吗?谢谢。yuhongda_06@163.com  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2009-12-11 23:20 lh

源代码请给我份:lihaoyxj@gmail.com  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架[未登录] 2009-12-16 18:08 jack

差劲。。。。  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2009-12-16 23:18 eXile

这里只提出一个实现思路,不再提供源代码,请各位见谅。  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2012-11-17 13:16 yak

看着源代码学习下?谢谢。yakczh@163.com  回复  更多评论   

# re: 利用boost::asio实现一个简单的服务器框架 2014-09-15 14:23 wu

@李
同一个 io_service 上不同的 回调是有处理顺序的,如果一个用时间太久,会影响其他回调的响应时间  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

统计

常用链接

留言簿(18)

随笔分类

随笔档案

服务器编程

搜索

最新评论

阅读排行榜

评论排行榜