首页 > 源码分享, 程序人生 > 事件处理模式之Reactor(二)

事件处理模式之Reactor(二)

本文是上一篇《事件处理模式之Reactor(一)》的下一篇,上一篇主要介绍了reactor模式的基本理论,这一篇主要通过实例,来介绍Reactor模式的具体使用。在开始本文之前,有必要再说明一下,reactor的源码的地址:reactor源码, 感兴趣的读者朋友可以自己用svn客户端check out到本地。
如左图所示为reactor项目的基本结构,整体项目分为三个部分:

  • 一是libreactor项目,用来生成reactor相关的lib;
  • 二是server项目,是用reactor实现的一个时间服务器程序;
  • 三是client项目,是用reactor实现的一个客户端程序。
  • 服务端和客户端之间通过telnet协议进行交互,目前仅支持time和exit两个命令,客户向服务端发送time命令,服务端返回当前时间;客户端向服务端发送exit命令,服务端断开客户端连接。如果要实现其它命令,可以直接通过扩展相关处理逻辑来实现。这里我们关注的重点是reactor模式,因此不在支持的命令方面做过多的扩展,感兴趣的朋友可以自己进行扩展。
    下面我们来看一下server的实现,从代码中可以看出,server主要包括两个类:

  • 一是TimeServer类,它主要用来处理新的客户端连接请求;
  • 二是RequestHandler类,它主要用来处理客户端与服务端之间的命令交互。
  • 点这里查看服务端源码:reactor_server_test.cc
    接下来,我们来看一下client的实现,从代码中可以看出,client主要包括一个类:

  • TimeClient类,它封装了所有客户端操作,完成与服务端之间的所有交互。
  • 点这里查看客户端源码:reactor_client_test.cc
    通过上面的介绍,以及相关源代码的学习,相信读者朋友对reactor模式的使用有了个初步的印象,下面来总结一下使用reactor的基本步骤,希望能够对用到的朋友有所帮助。总的来说,要使用reactor模式来实现一个网络server/client包括以下几个步骤:

  • 1. 实现处理读、写、出错事件的EventHandler
  • 2. 把1中实现的EventHandler注册到Reactor中
  • 3. 循环调用Reactor的HandleEvents来促使Reactor进行‘反应’,不断回调EventHandler中的事件处理回调函数。
    1. laonanwa
      2013年5月29日12:36 | #1

      编译命令:
      g++ -shared event_demultiplexer.cc event_demultiplexer.h reactor.cc reactor.h -fPIC -o libreactor.so
      g++ reactor_server_test.cc test_common.h -o reactor_server -L. libreactor.so
      g++ reactor_client_test.cc test_common.h -o reactor_client -L. libreactor.so

    2. sunday
      2016年8月4日11:08 | #2

      您好,有幸拜读您的文章,让我获益匪浅。有点遗憾的是目前代码下不下来,不能更详细的学习一下。

    1. 本文目前尚无任何 trackbacks 和 pingbacks.
    您必须在 登录 后才能发布评论.