一、重写muduo网络库之服务器编程及测试

这篇具有很好参考价值的文章主要介绍了一、重写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+Port
                const 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+Port
                const 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;      //#1
     EventLoop *_loop;       //#2 epoll
};

int main(){
     EventLoop loop; //epoll
     InetAddress addr("192.168.18.128",6000);
     ChatServer server(&loop, addr, "ChatServer");

     server.start();  //listenfd epoll_ctl=>epoll
     loop.loop(); //epoll_wait以阻塞的方式等待新用户的连接,已连接的用户读写事件等

     return 0;
}

运行一下

一、重写muduo网络库之服务器编程及测试

一、重写muduo网络库之服务器编程及测试文章来源地址https://www.toymoban.com/news/detail-442217.html

到了这里,关于一、重写muduo网络库之服务器编程及测试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1.9.C++项目:仿muduo库实现并发服务器之Connection模块的设计

    项目完整在: Connection模块,一个连接有任何的事件怎么处理都是有这个模块来进行处理的,因为组件的设计也不知道使用者要如何处理事件,因此只能是提供一些事件回调函数由使用者设置。 发送数据 —— 给用户提供的发生数据的接口,并不是真的发送接口,而只是把数

    2024年02月07日
    浏览(48)
  • 1.12.C++项目:仿muduo库实现并发服务器之LoopThreadPool模块的设计

    1.线程数量可配置(0或多个) 2. 对所有的线程进行管理,其实也就是管理0个或多个LoopThread对象! 3. 提供线程分配的功能! 针对LoopThread设计一个线程池,便于管理。 对所有的LoopThread进行分配和管理! 1.线程数量可配置(0或多个) 注意事项:在服务器中,主从Reactor模型是

    2024年02月07日
    浏览(50)
  • 1.6.C++项目:仿muduo库实现并发服务器之channel模块的设计

    项目完整版在: 1.对监控事件的管理 描述符是否可读 描述符是否可写 对描述符监控可读 对描述符监控可写 解除可读事件监控 解除可写事件监控 解除所有事件监控 2.对监控事件触发后的处理 设置对于不同事件的回调处理函数 明确触发了某个事件该如何处理 对socket套接字的

    2024年02月08日
    浏览(48)
  • 1.4.C++项目:仿muduo库实现并发服务器之buffer模块的设计

    项目完整版在: Buffer模块是一个缓冲区模块,用于实现通信中用户态的接收缓冲区和发送缓冲区功能。 存储数据,取出数据 1.实现换出去得有一块内存空间,采用vector ,vector底层是一个线性的内存空间! 1.默认空间大小 2.当前的读取数据位置! 3.当前的写入数据位置! 写入

    2024年02月07日
    浏览(46)
  • 1.5.C++项目:仿muduo库实现并发服务器之socket模块的设计

    项目完整版在: Socket模块是对套接字操作封装的一个模块,主要实现的socket的各项操作。 对socket套接字的操作进行封装。 对socket套接字的操作进行封装。 创建套接字 绑定地址信息 开始监听 向服务器发起连接 获取新连接 接受数据 发送数据 关闭套接字 创建一个监听链接

    2024年02月07日
    浏览(47)
  • C++集群聊天服务器 muduo+nginx+redis+mysql数据库连接池 笔记 (下)

    C++集群聊天服务器 网络模块+业务模块+CMake构建项目 笔记 (上)-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/135991635?spm=1001.2014.3001.5501 C++集群聊天服务器 数据模块+业务模块+CMake构建项目 笔记 (上)-CSDN博客 https://blog.csdn.net/weixin_41987016/article/details/136007616?spm=1001.2014.

    2024年02月19日
    浏览(91)
  • 【Linux网络编程】网络编程套接字(TCP服务器)

    作者:爱写代码的刚子 时间:2024.4.4 前言:本篇博客主要介绍TCP及其服务器编码 只介绍基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP地址 但是我们通常用点分十进制的字符串表示IP地址,以下函数可以在字符串表示和in_addr表示之间转换 字符串转in

    2024年04月14日
    浏览(79)
  • 1.16.C++项目:仿muduo库实现并发服务器之HttpContext以及HttpServer模块的设计

    添加请求—— 处理函数映射信息(GET/POST/PUT/DELETE) 设置静态资源根目录 设置是否启动超时连接关闭 设置线程池中线程数量 启动服务器 OnConnected - 用于给TcpServer设置协议上下文 OnMessage - 用于进行缓冲区数据解析处理 获取上下文,进行缓冲区数据对象 请求的路由查 找 静态资

    2024年02月07日
    浏览(55)
  • 网络编程(一)TCP单进程服务器编程详解

    想要学习socket网络编程的读者一定要首先学好计算机网络的理论知识,包括 1)osi网络七层模型与ip四层模型 2)套接字含义 3)局域网通信过程 4)广域网通信过程 5)tcp,udp通信协议,在这两个协议中的连接建立,数据封装,传输过程,传输中可能遇到的问题的处理(差错控

    2024年02月15日
    浏览(47)
  • 【网络编程】demo版TCP网络服务器实现

    UDP和TCP的区别: 对于TCP协议有几个特点: 1️⃣ 传输层协议 2️⃣ 有连接(正式通信前要先建立连接) 3️⃣ 可靠传输(在内部帮我们做可靠传输工作) 4️⃣ 面向字节流 对于UDP协议有几个特点: 1️⃣ 传输层协议 2️⃣ 无连接 3️⃣ 不可靠传输 4️⃣ 面向数据报 可以看到

    2024年02月06日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包