用jsp做校园网站,aspcms网站栏目调用,国家认可现货交易平台,网站建设 选猴王网络Muduo网络库#xff1a;底层实质上为Linux的epoll pthread线程池#xff0c;且依赖boost库。 muduo的网络设计核心为一个线程一个事件循环#xff0c;有一个main Reactor负载accept连接#xff0c;然后把连接分发到某个sub Reactor(采用轮询的方式来选择sub Reactor)… Muduo网络库底层实质上为Linux的epoll pthread线程池且依赖boost库。 muduo的网络设计核心为一个线程一个事件循环有一个main Reactor负载accept连接然后把连接分发到某个sub Reactor(采用轮询的方式来选择sub Reactor)该连接的所用操作都在那个sub Reactor所处的线程中完成。多个连接可能被分派到多个线程中以充分利用CPUReactor poll的大小是固定的根据CPU的数目确定。如果有过多的耗费CPU I/O的计算任务可以提交到创建的ThreadPool线程池中专门处理耗时的计算任务。 1、 muduo网络库实例
muduo网络库实质为: epoll 线程池优点是能够将网络I/O的代码和业务代码分开。 而业务代码主要分为用户的连接和断开、用户的可读写事件两类。至于什么时候发生这些事件由网络库进行上报如何监听这些事件都是网络库所封装好的我们就可以快速进行项目开发。
muduo给用户提供了两个主要的类 1、TcpServer用于编写服务器程序。 2、TcpClient用于编写客户端程序。
如何配置muduo网络库请参考 写文章-CSDN创作中心 muduo网络库服务器编程 基于muduo网络库开发服务器程序
组合TcpServer对象创建EventLoop事件循环对象的指针明确TcpServer构造函数需要什么参数输出ChatServer的参数在当前服务器类的构造函数当中注册处理连接的回调函数和处理读写事件的回调函数
#include muduo/net/TcpServer.h
#include muduo/net/EventLoop.h
#include iostream
#include functional
#include string
using namespace std;
using namespace muduo;
using namespace muduo::net;
using namespace placeholders;class ChatServer
{
public:ChatServer(EventLoop *loop,const InetAddress serverAddr,const string nameArg): _server(loop, serverAddr, nameArg), _loop(loop){// 注册连接回调_server.setConnectionCallback(std::bind(ChatServer::onConnection, this, _1));// 注册消息回调_server.setMessageCallback(std::bind(ChatServer::onMessage, this, _1, _2, _3));// 设置线程数量_server.setThreadNum(4); // 4个IO线程}void start(){_server.start();}private:// 处理连接void onConnection(const TcpConnectionPtr conn){if (conn-connected()){cout conn-peerAddress().toIpPort() - conn-localAddress().toIpPort() state : online endl;}else{cout conn-peerAddress().toIpPort() - conn-localAddress().toIpPort() state : offline endl;}}// 处理消息void onMessage(const TcpConnectionPtr conn, Buffer *buffer, Timestamp time){string buf buffer-retrieveAllAsString();cout recv data: buf time: time.toString() endl;conn-send(buf); // 回显消息}TcpServer _server;EventLoop *_loop;
};int main()
{EventLoop loop;InetAddress addr(127.0.0.1, 9898); // 监听 127.0.0.1:9898ChatServer server(loop, addr, ChatServer);server.start(); // 启动服务器loop.loop(); // 事件循环return 0;
} 上面的代码简单的使用了muduo网络库实现了一个回显服务器我们可以在linux系统终端中使用telnet命令让客户端连接。
2、muduo网络库原理 Muduo 基于 Reactor 模式核心是事件驱动。以下是其工作流程
启动服务器 创建一个 EventLoop 实例作为主循环。 创建一个 TcpServer 实例设置回调函数连接、消息处理。 调用 loop.loop() 开始事件循环。 事件监听 主线程监听新连接。 每当有新连接到来将其分配到工作线程处理。 事件分发与处理 EventLoop 监听事件通过 Poller 检测就绪的文件描述符。 调用 Channel 的回调函数处理事件。 数据收发与连接管理 使用 TcpConnection 提供的接口收发数据。 在连接断开时自动清理资源。
3、经典的服务器设计模式Reactor模式 服务端程序架构基本上是一个大的while循环程序阻塞在accept或poll函数上等待被监控的socket描述符上出现预期的事件。事件到达后accept或poll函数的阻塞解除程序向下执行根据socket描述符上出现的事件执行read、write或错误处理。 整体架构如下图所示 muduo的软件架构采用的也是Reactor模式只是整个模式被分成多个类并且支持以线程池的方式实现多线程并发处理所以显得有些复杂。整体架构如下图所示