zoukankan      html  css  js  c++  java
  • 利用boost::asio实现一个简单的服务器框架

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

    1. 实现回调:
    1. static void onSessionStarted(RequestPtr const& request, ResponsePtr const& response) {
    2.    request->setReadMode(Session::READ_LN); // 设置为行读取
    3. }
    4. static void onSession(RequestPtr const& request, ResponsePtr const& response) {
    5.    print(request->message()); //打印收到的消息
    6.    response->addReply(request->message()); //回送消息
    7.    response->close();
    8. }
    复制代码
    说明:close()是一个关闭请求,它并不马上关闭Session,而是等待所有与该Session相关的异步操作全部结束后才关闭。

    2. 一个单线程的Echo服务器:
    1. void server_main() {
    2. unsigned short port = 7;
    3. AsioService svc;
    4. AsioTcpServer tcp(svc, port);
    5. svc.callbacks().sessionStarted = &onSessionStarted;
    6. svc.callbacks().sessionHandle = &onSession;
    7. svc.run();
    8. }
    复制代码
    3. 一个多线程的Echo服务器(半异步半同步:一个主线程,4个工作者线程)
    1. void server_main2() {
    2. unsigned short port = 7;
    3. int num_threads = 4;
    4. AsioService svc;
    5. AsioService worker(AsioService::HAS_WORK);
    6. AsioTcpServer tcp(svc, port);
    7. svc.callbacks().sessionStarted = worker.wrap(&onSessionStarted);
    8. svc.callbacks().sessionHandle = worker.wrap(&onSession);
    9. AsioThreadPool thr(worker, num_threads);
    10. svc.run();
    11. }
    复制代码
      有了这样一个思路,实现起来就很容易了。重点是以下两点:
      1。缓冲区的管理与内存池的使用
      2。为了保证Session的线程安全,必须要设置一个挂起状态。
         
         还有一个好处,就是完全隔绝了asio的应用接口,不用再忍受asio漫长的编译时间了。代码就不贴在这里了,有兴趣的可以通过email 探讨。(说明,这里只提出一个思路,不再提供源代码,请各位见谅)
  • 相关阅读:
    [BAT]用BAT自作开机后自动启动截屏软件
    [TFS]如何彻底删除TFS上的团队项目
    [GIT]如何删除Git本地仓库
    [SQL] update select 查询的结果集
    [VS]反编译_DllToC#_REFLECTOR8.5
    Docker容器开机自动启动
    公告:开通csdn博客,敬请关注!
    1018 Public Bike Management
    微信红包算法
    LRU Cache
  • 原文地址:https://www.cnblogs.com/lzjsky/p/2017205.html
Copyright © 2011-2022 走看看