经过前面介绍相关的库和工具,比如Json、CMake、muduo等,我们可以开始编写本项目的代码了。
1.项目目录创建
一般一个项目由以下结构组成:
- bin文件夹存放:可执行程序
- build文件夹存放:编译过程中的临时文件
- include文件夹存放:头文件
- src文件夹存放:源代码
- test文件夹存放:测试用例,我们前面几章的测试代码就在这
- thirdparty文件夹存放:使用的别人的源代码,本项目使用了Json库
- CMakeLists.txt存放:CMake编译的文件夹,在 需要编译的目录都有一个
- autobuild.sh存放:编译的自动脚本
- README.md存放:项目的介绍,比如环境配置、编译、运行。
接下来介绍每一级目录的CMakeLists.txt文件的内容:
- 项目根目录下:
cmake_minimum_required(VERSION 3.0)
project(chat)
# 配置编译选项
set(CMAKE_CXX_FLAGS ${
CMAKE_CXX_FLAGS} -g)
# 配置最终的可执行文件输出的路径
set(EXECUTABLE_OUTPUT_PATH ${
PROJECT_SOURCE_DIR}/bin)
# 配置头文件的搜索路径
include_directories(${
PROJECT_SOURCE_DIR}/include)
include_directories(${
PROJECT_SOURCE_DIR}/include/server)
include_directories(${
PROJECT_SOURCE_DIR}/thirdparty)
# 加载子目录
add_subdirectory(src)
- 在子目录src中:
add_subdirectory(server) ##加载子目录
- 在server文件夹中:
#定义了一个SRC_LIST变量,包含了该目录下的所有源文件
aux_source_directory(. SRC_LIST)
# 指定生成可执行文件
add_executable(ChatServer ${
SRC_LIST})
# 指定可执行文件链接时需要依赖的库文件
target_link_libraries(ChatServer muduo_net muduo_base pthread)
2.网络模块代码ChatServer
这部分代码和muduo库介绍相似:muduo库简单介绍,本次会更详细介绍。
这次把实现放到.cpp中,声明放到.hpp中。
先看整体代码:
在include/server/中编写chatserver.hpp:
#ifndef CHATSERVER_H
#define CHATSERVER_H
#include <muduo/net/TcpServer.h>
#include <muduo/net/EventLoop.h>
using namespace muduo;
using namespace muduo::net;
// 聊天服务器的主类
class ChatServer
{
public:
// 初始化聊天服务器对象
ChatServer(EventLoop *loop,
const InetAddress &listenAddr,
const string &nameArg);
// 启动服务
void start();
private:
// 上报链接相关信息的回调函数
void onConnection(const TcpConnectionPtr &);
// 上报读写事件相关信息的回调函数
void onMessage(const TcpConnectionPtr &,
Buffer *,
Timestamp);
TcpServer _server; // 组合的muduo库,实现服务器功能的类对象
EventLoop *_loop; // 指向事件循环对象的指针
};
#endif
在/src/server/中实现chatserver.cpp
#include "chatserver.hpp"
#include "json.hpp"
#include "chatservice.hpp"
#include <iostream>
#include <functional>
#include <string>
using namespace std;
using namespace placeholders;
using json = nlohmann::json;
// 初始化聊天服务器对象
C