# RealmNet **Repository Path**: flyqingfeng/RealmNet ## Basic Information - **Project Name**: RealmNet - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-03 - **Last Updated**: 2026-07-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # RealmNet (墟界) > 可扩展的网络数据包框架 --- ## 简介 **RealmNet** 是一个 C++ 网络数据包框架,只做三件事:**协议定义、编解码、自动分发**。 它**不做**的事同样重要: | 框架负责 | 不负责(由 ISocket 后端决定) | |----------|------------------------------| | 协议序列化 / 反序列化 | 线程模型(单线程 / 线程池) | | 按 Packet::ID 自动路由到 Handler | I/O 模型(select / epoll / IOCP) | | 连接管理(收发缓冲、粘包处理) | 并发策略(多线程、协程) | `ISocket` 是唯一的扩展点。接入 epoll 就是高并发,接入 BSD Socket 就是单线程——框架核心代码**零改动**。 ``` Handler → PacketDispatcher → Codec → Connection → ISocket ↑ ↑ ↑ ↑ 你的逻辑 框架核心 你选的并发模型 ``` ```mermaid flowchart TB Handler["Handler
你的业务逻辑"] --> Dispatcher subgraph core["框架核心"] Dispatcher["PacketDispatcher
按 Packet::ID 自动路由"] Factory["Factory
协议注册"] Codec["Codec
编解码"] TypeHash["TypeHash
无 enum 协议 ID"] end Dispatcher --> Factory Dispatcher --> Codec Dispatcher --> TypeHash Codec --> Conn["Connection
胶水层"] Conn --> ISocket["ISocket
扩展点"] ISocket --> BSD["BSD Socket"] ISocket --> Epoll["epoll / kqueue"] ISocket --> IOCP["IOCP"] ``` ### 通信流程 ```mermaid sequenceDiagram participant C as 客户端 participant S as 服务端 C->>S: connect() C->>S: LoginRequest { account, password } S->>S: PacketDispatcher 路由到 Handler S->>C: LoginResponse { success, message } ``` --- ## 开始 ### 编译 要求 CMake 3.20+,C++20。 **MSVC:** ```bash mkdir build && cd build cmake .. -G "Visual Studio 17 2022" -A x64 cmake --build . --config Debug ``` **MinGW:** ```bash mkdir build && cd build cmake .. -G "MinGW Makefiles" \ -DCMAKE_C_COMPILER=/path/to/mingw/bin/gcc.exe \ -DCMAKE_CXX_COMPILER=/path/to/mingw/bin/g++.exe cmake --build . ``` ### 运行 先启服务端,再启客户端: ```bash ./Debug/RealmNetServer.exe # 服务端 ./RealmNetClient.exe # 客户端 ``` --- ## 示例 ### 定义协议 ```cpp class LoginRequest : public RealmNet::BasePacket { REALMNET_PACKET(LoginRequest) // 自动生成 type/typeName/ID std::string account; std::string password; void serialize(RealmNet::BinaryWriter& w) const override { w.writeString(account); w.writeString(password); } void deserialize(RealmNet::BinaryReader& r) override { account = r.readString(); password = r.readString(); } }; REGISTER_PACKET(LoginRequest); ``` ### 服务端 ```cpp #include "common/Server.h" #include "common/Packets.h" int main() { Server server; server.setPort(9000); // 注册 lambda 处理器,packet 已自动转型为 LoginRequest& server.registerHandler( [](RealmNet::IConnection& conn, LoginRequest& packet) { LoginResponse resp; resp.success = (packet.password == "123456"); conn.sendPacket(resp); }); server.start(); } ``` ### 客户端 ```cpp #include "common/Client.h" #include "common/Packets.h" int main() { Client client; client.registerHandler( [](RealmNet::IConnection& conn, LoginResponse& packet) { std::cout << packet.message << std::endl; }); client.connect("127.0.0.1", 9000); LoginRequest req; req.account = "admin"; req.password = "123456"; client.send(req); client.run(); } ``` --- ## 目录结构 ``` RealmNet/ ├── realmnet/core/ # 框架核心 │ ├── BasePacket.h # 数据包基类 │ ├── BinaryReader.h/writer.h # 二进制读写 │ ├── Connection.h # 胶水层 │ ├── PacketCodec.h # 编解码 │ ├── PacketDispatcher.h # 分发器 │ ├── PacketFactory.h # 工厂 │ ├── PacketRegistrar.h # 自动注册 │ └── TypeHash.h # 无 enum 协议 ID │ ├── realmnet/socket/ │ └── ISocket.h # Socket 抽象接口 │ ├── common/ # 示例代码 │ ├── Packets.h # 协议定义 │ ├── Server.h # 服务端封装 │ ├── Client.h # 客户端封装 │ ├── TcpSocket.h/cpp # ISocket 的 BSD 实现 │ ├── server/main.cpp # 服务端示例 ├── client/main.cpp # 客户端示例 └── CMakeLists.txt ``` --- ## 扩展 接入新后端只需实现 `ISocket`: ```cpp class MyEpollSocket : public RealmNet::ISocket { bool send(const uint8_t* data, size_t len) override { /* epoll send */ } int recv(uint8_t* buf, size_t len) override { /* epoll recv */ } void close() override { /* ... */ } }; ``` 然后用 `Server` 和 `Client` 即可。 线程模型、I/O 多路复用、并发策略都由你选的 Socket 后端决定,框架核心代码不需要改动。 --- ## 许可证 MIT