从epoll构建muduo-3 加入第一个类,顺便介绍reactor
mini-muduo版本传送门 mini-muduo v 0.02版本,这个版本添加的内容非常少,完整可运行的示例可从github下载,使用命令git checkout v0.02可切换到此版本,在线浏览到这里
1 TcpServer作为第一个对象加入进来,以后main里面就只需要写几句简单的调用,主要逻辑从main函数移到了TcpServer里,一般来说全局只需要创建一个TcpServer的对象,然后通过调用TcpServer::start()启动整个服务器程序。 本版代码没太多好说的,正好借这个空记录下reactor模式,因为muduo就是使用的reactor模式,尽早了解这个模式可以帮助我们更好的理解代码。通过查看wikipedia,可以看到很多语言都有reactor模式的网络库,典型的比如Python写的Twisted。通过对比reactor和muduo的代码,发现muduo并没有完全按照文章介绍的类来组织程序,有一些小改动,后面每个版本增加新代码时会对照一下reactor的标准模板。 我参考的reactor模式来源是Douglas C. Schmidt一篇paper,下面是pdf连接 An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events 文章对reactor模式进行了讲解,我把最主要的部分摘抄出来 1 reactor的类图结构: 2 主要类介绍: Handles 操作系统管理的某种资源,比如socket描述符,Synchronous Event Demultiplexer可以在多个Handle上等待事件的发生,比如等待socket的读写事件。 Synchronous Event Demultiplexer 用来在多个Handle上等待事件发生,在Linux平台上就是select/poll/epoll函数了。 Initiation Dispatcher 提供给应用程序使用,应用程序借助Initiation Dispatcher可以在Handle上注册或者注销监听。 Event Handler 这是一个接口,应用程序实现满足这个接口的类,然后通过Initiation Dispatcher将这个类注册到Handle上 Concrete Event Handler 这是应用程序实现的,满足Event Handler接口的类,通常来说,服务器程序会有两个最典型的Concrete Event Handler,原文中一个叫做Logging Acceptor,另一个叫做Logging Handler,Logging Acceptor负责创建并且注册Logging Handlers,Logging Handler处理读写事件。 3 类之间的协作关系: 1 当应用程序注册一个Concrete Event Handler到Initiation Dispatcher的时候,应用程序指定关注的事件类型 2 Initiation Dispatcher需要每个Event Handler回传它内部的Handle 3 当所有的Event Handler注册好后,应用程序调用handle_events来启动事件循环,此时Initiation Dispatcher使用Synchronous Event Demultiplexer在Handles集合上等待。 4 当某个Handle上有事件发生时,Synchronous Event Demultiplexer通知Initiation Dispatcher 5 Initiation Dispatcher使用Handler作为key来找到某个Event Handler 6 Initiation Dispatcher调用Event Handler的handle_event()方法 4 时序图
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |