# BJ_SOCKET **Repository Path**: BAIJIE4015/bj_-socket ## Basic Information - **Project Name**: BJ_SOCKET - **Description**: TCP UDP HTTP 串口 C++封装的跨平台库 接口简单 使用方便 - **Primary Language**: C++ - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-12 - **Last Updated**: 2026-03-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # BJNET 网络库 BJNET 是一个跨平台的网络库,支持 TCP、UDP、HTTP 和串口通信,提供统一的 API 接口和灵活的扩展能力。 ## 目录结构 ``` bj_-socket/ ├── include/ # 头文件目录 │ ├── bjnet_adapters.h # 适配器类(C++接口到C风格API的适配) │ ├── bjnet_api.h # C风格API接口 │ ├── factory.h # 网络工厂(创建各种网络实例) │ ├── http.h # HTTP相关接口 │ ├── io_multiplexer.h # IO多路复用接口 │ ├── listeners.h # 监听器接口(事件回调) │ ├── platform.h # 平台相关定义 │ ├── serial.h # 串口通信接口 │ ├── socket.h # 基础Socket接口 │ ├── tcp.h # TCP相关接口 │ └── udp.h # UDP相关接口 ├── src/ # 源文件目录 │ ├── linux/ # Linux平台实现 │ │ ├── platform_linux.cpp │ │ └── serial_linux.cpp │ ├── windows/ # Windows平台实现 │ │ ├── platform_windows.cpp │ │ ├── serial_windows.cpp │ │ ├── socket_impl.cpp │ │ └── socket_impl.h │ ├── bjnet_adapters.cpp # 适配器实现 │ ├── bjnet_api.cpp # API实现 │ ├── factory.cpp # 工厂实现 │ ├── http.cpp # HTTP实现 │ ├── io_multiplexer.cpp # IO多路复用实现 │ ├── listeners.cpp # 监听器实现 │ ├── serial.cpp # 串口实现 │ ├── socket.cpp # 基础Socket实现 │ ├── tcp.cpp # TCP实现 │ └── udp.cpp # UDP实现 ├── CMakeLists.txt # CMake构建文件 ├── bjnet.pro # Qt构建文件 └── LICENSE # 许可证文件 ``` ## 文件作用说明 ### 核心文件 1. **include/socket.h** - 基础Socket接口,定义了跨平台的Socket操作,包括创建、绑定、连接、发送、接收等基本功能。 2. **include/tcp.h** - TCP相关接口,定义了TCP服务器、客户端和连接的接口,支持IPv4和IPv6。 3. **include/udp.h** - UDP相关接口,定义了UDP套接字和客户端的接口,支持IPv4和IPv6。 4. **include/io_multiplexer.h** - IO多路复用接口,定义了跨平台的IO多路复用机制,支持select、poll和epoll(Linux)。 5. **include/listeners.h** - 监听器接口,定义了各种网络事件的回调接口,如连接建立、数据接收、错误发生等。 6. **include/factory.h** - 网络工厂,提供了创建各种网络实例的统一接口,如TCP服务器、UDP套接字等。 7. **include/bjnet_api.h** - C风格API接口,提供了C语言风格的函数接口,方便与其他语言集成。 8. **include/bjnet_adapters.h** - 适配器类,将C++接口适配到C风格API,实现了接口转换。 ### 扩展文件 1. **include/http.h** - HTTP相关接口,定义了HTTP客户端和服务器的接口。 2. **include/serial.h** - 串口通信接口,定义了串口操作的接口,支持跨平台。 3. **include/platform.h** - 平台相关定义,处理不同平台的差异。 ### 实现文件 - **src/socket.cpp** - 基础Socket实现,封装了不同平台的Socket操作。 - **src/tcp.cpp** - TCP实现,实现了TCP服务器、客户端和连接的功能。 - **src/udp.cpp** - UDP实现,实现了UDP套接字和客户端的功能。 - **src/io_multiplexer.cpp** - IO多路复用实现,实现了select、poll和epoll等多路复用机制。 - **src/listeners.cpp** - 监听器实现,实现了各种网络事件的回调机制。 - **src/factory.cpp** - 工厂实现,实现了创建各种网络实例的功能。 - **src/bjnet_api.cpp** - API实现,实现了C风格API的功能。 - **src/bjnet_adapters.cpp** - 适配器实现,实现了C++接口到C风格API的适配。 - **src/http.cpp** - HTTP实现,实现了HTTP客户端和服务器的功能。 - **src/serial.cpp** - 串口实现,实现了串口操作的功能。 - **src/platform_*.cpp** - 平台相关实现,处理不同平台的差异。 ## 编译和使用 ### 使用 CMake 编译 ```bash mkdir build cd build cmake .. cmake --build . ``` ### 使用 Qt 编译 ```bash qmake bjnet.pro make ``` ### 链接库 将编译生成的库文件链接到你的项目中,并包含相应的头文件。 ## 支持的平台 - Windows - Linux ## 特性 - 跨平台支持(Windows、Linux) - 支持TCP、UDP、HTTP和串口通信 - 支持IPv4和IPv6 - 支持IO多路复用(select、poll、epoll) - 提供C++和C风格API - 可扩展的监听器机制 - 统一的工厂模式创建实例 ## 功能详情 ### TCP功能 - 服务器/客户端模式 - 连接管理 - 数据收发 - 超时设置 - IPv4/IPv6自动识别 - 非阻塞IO ### UDP功能 - 数据报发送/接收 - 广播/组播支持 - IPv4/IPv6支持 - 超时设置 ### HTTP功能 - 客户端/服务器模式 - 支持GET、POST、PUT、DELETE等HTTP方法 - 支持HTTP/1.0和HTTP/1.1 - 支持请求/响应头管理 - 支持HTTPS(可选) ### 串口功能 - 跨平台串口操作(Windows、Linux) - 支持多种波特率(1200-921600) - 支持自定义波特率 - 支持数据位设置(5-8位) - 支持停止位设置(1-2位) - 支持奇偶校验设置(无、奇、偶、标记、空格) - 支持流控制设置(无、硬件) - 支持超时设置 - 端口枚举功能 - 端口存在性检查 - 缓冲区管理 ### IO多路复用 - 支持select、poll、epoll(Linux) - 统一的事件处理机制 - 高效的事件循环 ### 监听器机制 - 事件驱动的回调机制 - 支持多种网络事件(连接、数据、错误等) - 可自定义监听器实现 ### 工厂模式 - 统一的实例创建接口 - 支持依赖注入 - 可扩展的创建机制 ## 使用示例 ### TCP客户端示例 ```cpp // 获取网络工厂实例 auto pFactory = NetworkFactory::GetInstance(); // 创建TCP客户端 auto pClient = pFactory->CreateTcpClient(); // 连接服务器 if (pClient->Connect(NetworkAddress("127.0.0.1", 8080))) { std::cout << "连接成功" << std::endl; // 发送数据 const char* pData = "Hello, Server!"; pClient->Send(pData, strlen(pData)); // 接收数据 char buffer[1024]; int nBytes = pClient->Recv(buffer, sizeof(buffer)); if (nBytes > 0) { std::cout << "接收到数据: " << std::string(buffer, nBytes) << std::endl; } // 断开连接 pClient->Disconnect(); } else { std::cerr << "连接失败" << std::endl; } ``` ### TCP服务器示例 ```cpp // 自定义服务器监听器 class MyServerListener : public ITcpServerListener { public: void OnAccept(std::shared_ptr pConnection) override { std::cout << "新连接: " << pConnection->GetRemoteAddress().strIp << std::endl; // 回显数据 char buffer[1024]; int nBytes = pConnection->Recv(buffer, sizeof(buffer)); if (nBytes > 0) { pConnection->Send(buffer, nBytes); } } void OnError(const std::string& strError) override { std::cerr << "服务器错误: " << strError << std::endl; } }; // 获取网络工厂实例 auto pFactory = NetworkFactory::GetInstance(); // 创建服务器监听器 auto pListener = std::make_shared(); // 创建TCP服务器 auto pServer = pFactory->CreateTcpServer(pListener, NetworkAddress("0.0.0.0", 8080)); // 启动服务器 if (pServer->Start()) { std::cout << "服务器启动成功" << std::endl; // 运行服务器 while (true) { std::this_thread::sleep_for(std::chrono::seconds(1)); } } else { std::cerr << "服务器启动失败" << std::endl; } ``` ### 串口通信示例 ```cpp // 获取网络工厂实例 auto pFactory = NetworkFactory::GetInstance(); // 创建串口对象 auto pSerial = pFactory->CreateSerialPort(); // 配置串口 serial::SerialConfig stConfig; stConfig.enBaudRate = serial::BaudRate::B9600; stConfig.enDataBits = serial::DataBits::EIGHT; stConfig.enStopBits = serial::StopBits::ONE; stConfig.enParity = serial::Parity::NONE; stConfig.enFlowControl = serial::FlowControl::NONE; // 打开串口 if (pSerial->Open("COM1", stConfig)) { std::cout << "串口打开成功" << std::endl; // 写入数据 const char* pData = "Hello, Serial!"; pSerial->Write(pData, strlen(pData)); std::cout << "发送数据: " << pData << std::endl; // 读取数据 char buffer[1024]; int nBytes = pSerial->Read(buffer, sizeof(buffer)); if (nBytes > 0) { std::cout << "接收到数据: " << std::string(buffer, nBytes) << std::endl; } // 关闭串口 pSerial->Close(); } else { std::cerr << "串口打开失败" << std::endl; } // 获取可用串口列表 auto vecPorts = serial::ISerialPort::GetAvailablePorts(); std::cout << "可用串口: " << std::endl; for (const auto& strPort : vecPorts) { std::cout << " - " << strPort << std::endl; } ``` ## 许可证 AGPL-3.0 License