事件处理模式之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中的事件处理回调函数。
posted @ 2014-01-28 16:25  孤火  阅读(737)  评论(1编辑  收藏  举报