muduo是一个高质量的Reactor网络库,采用one loop per thread + thread pool架构实现,代码简洁,逻辑清晰,是学习网络编程的很好的典范。
为什么需要网络库
使用Sockets API进行网络编程是一件简单地技术,但是高级语言的Sockets库并没有对Sockets API提供更高层次的封装,直接用它编写网络程序很容易掉到陷阱里,因此需要网络库来降低开发难度,网络库的价值还在于能方便地处理并发连接。
library和framework的区别
1.库是将代码集合成的一个产品,供程序员调用。面向对象的代码组织形式而成的库也叫类库。面向过程的代码组织形式而成的库也叫函数库。
在函数库中的可直接使用的函数叫库函数。开发者在使用库的时候,只需要使用库的一部分类或函数,然后继续实现自己的功能。
框架则是为解决一个(一类)问题而开发的产品,框架用户一般只需要使用框架提供的类或函数,即可实现全部功能。可以说,框架是库的升级版。开发者在使用框架的时候,必须使用这个框架的全部代码。
2.库中的类相对比较独立,我们编写应用的时候需要编写一些“胶水代码”来粘合。
框架是恶能够应用于特定领域的,不需要编写过多的“胶水代码”
3.框架与库的重要区别是:框架提供用户一些回调函数,使得框架能够调用我们所编写的回调函数,这就使得控制反转了
muduo库可以认为是一个小型框架。
Reactor模式
muduo库中有许多Event Loop(如果是单线程的话只有一个Event Loop),这个Event Loop实际上就是poll、epoll机制,是一个循环,在等待网络事件,如果网络事件触发,就回调我们的应用。
比如当一个客户端连接的时候,能够回调表示客户端已连接,那么客户端连接以后的一些具体操作,就可以在App中编写逻辑,当有数据到来的时候,muduo库能够回调有消息到来的对应函数,使得具体的业务逻辑可以在应用层进行编写,而不是把具体的业务放在库中编写。
面向对象的编程风格
muduo库只暴露具体类,不暴露抽象类,也不适用虚函数做接口
基于对象的编程风格
使用boost::function、boost::bind实现基于对象的编程风格
基础库
muduo/base目录是一些基础库,都是用户可见的类,可以在用户程序中直接使用。
base
AsyncLogging.(h,cc) 异步日志backend
Atomic.h 原子操作与原子整数