基于muduo网络库开发服务器程序
环境安装配置请看这篇文章:
https://blog.csdn.net/xiaoduan6/article/details/125023408
流程
- 组合TcpServer对象
- 创建EventLoop事件循环对象
- 明确TcPServer构造函数的参数,输出CharServer的参数
- 在当前服务器类的构造函数中,注册处理连接的回调函数
- 设置合适的服务器的线程数量,muduo库会自己分配I/O线程和worker线程
代码
vim muduo_server.cpp
#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 &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));
//设置服务器的线程数量
_server.setThreadNum(2);
}
//开启事件循环
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;
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;
EventLoop *_loop;
};
int main()
{
EventLoop loop; //epoll
InetAddress addr("127.0.0.1",6000);
ChatServer server(&loop,addr,"ChatServer");
server.start(); //listenfd epoll_ctl -> epoll
loop.loop(); //epoll_wait以阻塞的方式等待新用户连接,已连接用户的读写事件等
return 0;
}
测试
第一个shell:
g++ -o server muduo_server.cpp -lmuduo_net -lmuduo_base -lpthread
第二个shell
telnet 127.0.0.1 6000
cmake
cmake_minimum_required(VERSION 3.0)
project(main)
# 配置编译选项
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g )
### 配置头文件的搜索路径
#include_directories()
#配置库文件的搜索路径
#link_directories()
#设置要编译的源文件列表
set(SRC_LIST muduo_server.cpp)
#设置可执行文件存放的目录
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
# 把指定路径下的所有源文件的名字放到SRC_LIST
#aux_source_directory(. SRC_LIST)
#表示生成可执行文件server,由SRC_LIST编译而来
add_executable(server ${SRC_LIST})
#server需要的连接的库文库
target_link_libraries(server muduo_net muduo_base pthread)