一、重写muduo网络库之服务器编程及测试
目录
一、基于muduo网络库开发服务器程序的基本步骤
1、组合TcpServer对象
2、创建EventLoop事件循环对象的指针
3、明确TCPServer构造函数需要的参数,输出ChatServer的构造函数
4、在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数
5、设置合适的服务端线程数量,muduo库会自己分配I/O线程和work线程
二、测试代码
今天开始,小鱼将和大家一起学习陈硕大佬的优秀开源项目------muduo网络库,并重写muduo网络库的一些重要的函数、类等代码,学习优秀的开源代码和编码思维。
在学习muduo网络库之前,我们首先要知道muduo库如何使用,今天,我们一起来用muduo库写一下简单的服务器和客户端的代码,并测试一下。
首先,我们要知道muduo网络库提供了两个重要的类
TcpServer:用于编写服务器程序
TCPClient:用于编写客户端程序
mudou网络库使用了epoll+线程池,这样的做的好处是可以把网络I/O的代码和业务代码区分开。
接下来,我们就开始用muduo网络库编写代码。
一、基于muduo网络库开发服务器程序的基本步骤
1、组合TcpServer对象
EventLoop* loop, //事件循环
const InetAddress &listenAddr, //IP+Port
const string &nameArg //服务器的名字
这里的EventLoop *loop就是事件循环,也可以理解为reactor模型的反应堆。const InetAddress &listenAddr表示服务器的端口,const string &nameArg 指的是服务器的名字,也就是给线程绑定一个名字。
2、创建EventLoop事件循环对象的指针
3、明确TCPServer构造函数需要的参数,输出ChatServer的构造函数
class ChatServer{
public:ChatServer(EventLoop* loop, //事件循环const InetAddress &listenAddr, //IP+Portconst string &nameArg) //服务器的名字: _server(loop, listenAddr, nameArg), _loop(loop){//给服务器注册用户连接的创建和断开回调_server.setConnectionCallback(std::bind(&ChatServer::onConnection,this,_1));//给服务器注册用户读写时间回调_server.setMessageCallback(std::bind(&ChatServer::onMessage, this,_1,_2,_3));//设置服务器端的线程数量,1个IO线程,3个work线程_server.setThreadNum(4);}//开启事件循环void start(){_server.start();}
这里的setConnectionCallback(std::bind(&ChatServer::onConnection,this,_1))函数绑定了onConnection的this。当底层监测到有用户的连接和断开的时候就会帮我们调用这个函数,给服务器注册用户连接的创建和断开回调。
下面的setMessageCallback(std::bind(&ChatServer::onMessage, this,_1,_2,_3))函数也是同样的意思。
4、在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数
//专门处理用户的连接创建和断开 epoll listenfd accept 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;conn->shutdown(); //close(fd)//_loop->quit(); 连接断开}}
这是专门处理用户的连接创建和断开的函数。
//专门处理用户读写事件void onMessage(const TcpConnectionPtr &conn, //连接Buffer *buffer, //缓冲区Timestamp time) //接收到数据的时间信息{string buf = buffer->retrieveAllAsString();cout << "recv data:" << buf << "time:" << time.toString() << endl;conn->send(buf);}
这是专门处理用户读写事件的函数。
5、设置合适的服务端线程数量,muduo库会自己分配I/O线程和work线程
//设置服务器端的线程数量,1个IO线程,3个work线程_server.setThreadNum(4);
设置服务器端的线程数量,1个IO线程,3个worker线程
第一个工作线程做耗时的I/O操作,主要是传输文件、音视频等二进制文件的操作;
第二个线程处理已连接事件的读写事件;
第三个线程处理用户的连接和断开;
二、测试代码
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
#include <iostream>
#include <string>
#include <functional>
using namespace std;
using namespace muduo;
using namespace muduo::net;/*基于muduo网络库开发服务器程序
1、组合TcpServer对象
2、创建EventLoop事件循环对象的指针
3、明确TCPServer构造函数需要什么参数,输出ChatServer的构造函数
4、在当前服务器类的构造函数当中,注册处理连接的回调函数和处理读写事件的回调函数
5、设置合适的服务端线程数量,muduo库会自己分配I/O线程和work线程
*/
class ChatServer{
public:ChatServer(EventLoop* loop, //事件循环const InetAddress &listenAddr, //IP+Portconst string &nameArg) //服务器的名字: _server(loop, listenAddr, nameArg), _loop(loop){//给服务器注册用户连接的创建和断开回调_server.setConnectionCallback(std::bind(&ChatServer::onConnection,this,_1));//给服务器注册用户读写时间回调_server.setMessageCallback(std::bind(&ChatServer::onMessage, this,_1,_2,_3));//设置服务器端的线程数量,1个IO线程,3个work线程_server.setThreadNum(4);}//开启事件循环void start(){_server.start();}
private://专门处理用户的连接创建和断开 epoll listenfd accept 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;conn->shutdown(); //close(fd)//_loop->quit(); 连接断开}}//专门处理用户读写事件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; //#1EventLoop *_loop; //#2 epoll
};int main(){EventLoop loop; //epollInetAddress addr("192.168.18.128",6000);ChatServer server(&loop, addr, "ChatServer");server.start(); //listenfd epoll_ctl=>epollloop.loop(); //epoll_wait以阻塞的方式等待新用户的连接,已连接的用户读写事件等return 0;
}
运行一下
一、重写muduo网络库之服务器编程及测试相关推荐
- Muduo网络库核心梳理
Muduo网络库 Muduo网络库本身并不复杂,是一个新手入门C++面向对象网络编程的经典实战项目.但是,新手在刚刚上手读代码的时候,非常容易陷入代码的汪洋大海,迷失方向.本文旨在简要梳理Muduo网 ...
- muduo网络库学习(七)用于创建服务器的类TcpServer
目前为止,涉及到的绝大多数操作都没有提及线程,EventLoop,Poller,Channel,Acceptor,TcpConnection,这些对象的执行都是在单独线程完成,并没有设计多线程的创建销 ...
- 基于C++11的muduo网络库
文章目录 写在前面 项目编译问题 库安装的问题 项目测试代码 关于压力测试 项目概述 muduo网络库的reactor模型 muduo的设计 muduo各个类 辅助类 NonCopyable Time ...
- muduo网络库浅谈(一)
muduo网络库浅谈(一) 序言 第一章 muduo的关键结构 class EventLoop class Channel class Poller 番外 定时任务 class Timestamp c ...
- muduo网络库源码阅读Step by Step
Posted on: Nov 26 2015 Categories: muduo C++ Tags: muduo 一般写服务端程序都需要有一个称手的网络库来帮我们处理琐碎的网络通信细节,比如连接的建立 ...
- muduo网络库源码复现笔记(十七):什么都不做的EventLoop
Muduo网络库简介 muduo 是一个基于 Reactor 模式的现代 C++ 网络库,作者陈硕.它采用非阻塞 IO 模型,基于事件驱动和回调,原生支持多核多线程,适合编写 Linux 服务端多线程 ...
- muduo网络库的封装
一.基础socket编程 网络编程的底层离不开socket,其处理流程表示如下: int sockfd = socket(AF_INET, SOCK_STREAM, 0);struct sockadd ...
- C++练手项目(基于muduo网络库+mysql+jsoncpp的简易HTTPWebServer用于网页显示数据库后台数据
基于muduo网络库+mysql+jsoncpp的简易HTTPWebServer 项目介绍 背景介绍 主要模块介绍 1.基于muduo网络库的WebServer: 2.HTTP协议栈 3.JsonSe ...
- muduo网络库学习总结:基本架构及流程分析
muduo网络库学习:基本架构及流程分析 基本架构 Basic Reactor Mutiple Reactor + ThreadPool muduo库的基本使用 基本结构介绍 EventLoop类 P ...
最新文章
- autojs开启悬浮窗权限_微信悬浮窗功能普及?甚至更胜一筹
- 每日一皮:当我突然有一个很棒的调试想法...
- yum安装docker(阿里镜像源)及docker-compose二进制安装
- SAP CRM WebClient UI element id的生成逻辑
- @Nullable 注解的用法
- python自然语言处理书籍_精通Python自然语言处理pdf
- 【JEECG Docker安装】CentOS6下docker的安装和使用
- Criteria和DetachedCriteria区别应用
- C++安全方向(三):3.6 SHA2原理分析和比特币挖矿,以及代码演示
- TEM测试常见问题及解答(三)
- 263企业邮箱:客户端授权码登录
- 一个小玩意 PHP实现微信红包金额拆分试玩
- Java8-惰性求值
- #第三章 数理文化的发展3.1毕达哥拉斯
- 神经系统分类和组成图表,神经系统的组成概念图
- linux libuv,libuv queue的实现
- 【有利可图网】PS教程:利用PS分分钟将照片变成中国风古画效果
- 上万条个性签名与个性网名ACCESS数据库
- java自动化测试语言高级之文档注释
- 开发工程师应该具备哪些能力
热门文章
- JavaWeb _ 07 session、Cookie和七天免登陆
- python tkinter怎么安装_python安装tkinter
- EXCEL中与SUM相关的函数
- 转载 | 身份管理入门
- CGB2102Web总结
- 基于Springboot+mysql手机商城(带后台管理系统)
- python(自带的idle+pycharm)常用的快捷键+如何自定义快捷键以及如何修改pycharm的背景颜色
- c语言 数列累乘法,高中数学,掌握累乘法的特点,求数列的通项,很简单!
- Windows7 Android 开发环境搭建
- Elasticsearch/Kibana/X-pack/Logstash 6.x版本的安装