# ChatServer **Repository Path**: hre_1_0/chat-server ## Basic Information - **Project Name**: ChatServer - **Description**: 基于Tcp长链接的聊天服务器。 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-24 - **Last Updated**: 2025-05-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ChatServer ## 介绍 基于`Tcp`长链接的聊天服务器。服务器使用`Boost.Asio`异步网络框架,整体网络传输采用的是异步非阻塞模型。使用`Asio`线程池提高了服务器并发量。 ## 前置知识 ## 1.`Boost.Asio`异步网络库中`io_context`、`socket`、`acceptor`三者关系? **`io_context`:异步操作的核心调度器** 作用:**`io_context`**是`Boost.Asio`的事件循环核心,负责管理所有异步`I/O`操作的任务队列和调度。所有异步操作(如连接、读写等)都需要通过`io_context`提交给操作系统,并在操作完成时触发回调函数。 `io_context`与`socket`和`acceptor`的关系。 1.`socket`和`acceptor`的构造函数必须传入`io_context`实例,以绑定到具体的I/O服务上。 **`acceptor`:TCP连接的监听器** 作用:**`acceptor`**用于在服务器端监听特定端口的TCP连接请求。它封装了系统级的监听套接字(listen socket),并通过异步操作(`async_accept()`)接受客户端连接 。 `acceptor`与`io_context`和`socket`的关系: 初始化`acceptor`时需要传入`io_context`和`endpoint`(包含协议、`IP`和端口) ```c++ tcp::acceptor acceptor(io_context, tcp::endpoint(tcp::v4(), 8080)); ``` 当客户端连接到达时,`acceptor`会创建一个新的`socket`对象(通过`async_accept()`),并交由该`socket`处理后续通信。 **`socket`:数据传输的通道** 作用:`socket`表示一个网络连接的端点,用于发送和接收数据。每个TCP连接对应一个`socket`实例,支持同步和异步操作。 `socket`与`io_context`和`acceptor`的关系: `socket`的初始化依赖`io_context`,所有异步读写操作(如`async_read_some()`、`async_write()`)都通过`io_context`提交。 `acceptor`通过`async_accept()`生成的`socket`实例是客户端与服务器通信的载体,后续数据交互由该`socket`完成。 ## 2.异步架构服务器如何客户端建立通信? **初始化** - 创建`io_context`,作为所有异步操作的调度中心。 - 创建`acceptor`并绑定到指定端口,开始监听客户端连接。 - 调用`acceptor.async_accept()`异步等待客户端连接。 **接受连接**: - 当有客户端连接时,`acceptor`生成一个新的`socket`实例,并通过回调函数通知应用程序。 - 新创建的`socket`对象绑定到`io_context`,用于后续通信。 **数据传输**: - 通过`socket`的异步读写接口(如`async_read()`、`async_write()`)收发数据。 - 所有操作由`io_context`调度,确保非阻塞和高并发。 **事件循环**: 调用`io_context.run()`启动事件循环,处理所有异步操作的回调。 **总结:** - **层级关系**: `io_context` > `acceptor` > `socket`。 `io_context`是底层调度核心,`acceptor`依赖它监听连接,`socket`依赖它处理数据。 - **设计模式**: `io_context`实现了`Proactor`模式,通过异步事件驱动机制分离I/O操作与业务逻辑,提升性能。 - **典型场景**: ​ 服务器:单`acceptor`监听端口,多个`socket`处理并发连接。 ​ 客户端:直接创建`socket`连接服务器,通过`io_context`管理异步操作 ## 3.`gRpc`通信时,`channel`和`stub`之间的联系? 在`gRPC`中,**Channel**和**Stub**是客户端与服务器通信的两个核心组件 **Channel(通道)的作用** **底层通信管理**: Channel 是客户端与服务器之间的连接抽象,负责底层网络通信的管理,包括: - 连接的建立与维护(如HTTP/2连接)。 - 连接池管理(复用连接提升性能)。 - 负载均衡策略(如轮询、随机选择服务端实例)。 - 重试机制、超时设置、拦截器(Interceptors)等全局配置。 **生命周期**: Channel 通常是长期存在的,可以被多个 Stub 共享以提高效率。它的创建和关闭成本较高,通常在整个客户端生命周期内复用。 **Stub(存根)的作用** - **服务方法代理**: Stub 是客户端根据服务定义(`.proto`文件)生成的代码,充当远程服务的本地代理。它负责: - 将方法调用(如 `sayHello()`)封装成 `RPC` 请求。 - 将请求通过 Channel 发送到服务器,并接收响应。 - 反序列化响应数据为客户端可用的对象。 - **服务特定性**: 每个 Stub 对应一个服务(Service),例如 `GreeterServiceStub` 对应 `GreeterService` 中定义的所有方法。 **联系与协作** 1. **依赖关系**: Stub **必须**绑定到一个 Channel 才能工作。创建 Stub 时需显式传入 Channel: ```c++ // 创造channel shared_ptr channel = grpc::CreateChannel( host + ":" + port, grpc::InsecureChannelCredentials()); // 创建stub,必须绑定Channel StatusService::Stub stub(StatusService::NewStub(channel)); ``` ## 一、软件架构 软件架构说明 ## 二、安装教程 1. xxxx 2. xxxx 3. xxxx ## 三、使用说明 1. xxxx 2. xxxx 3. xxxx ## 四、源码剖析 ### 1.中间件 #### AsioIOContextPool类 ### 2.核心 CServer类 CSession类 ## 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request ## 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)