# ev **Repository Path**: ThinkingT/ev ## Basic Information - **Project Name**: ev - **Description**: nginx p2p - **Primary Language**: C - **License**: BSD-3-Clause-Clear - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-03-15 - **Last Updated**: 2026-03-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 这是一个基于Nginx的WebSocket长连接模块,支持客户端管理、组管理以及通过Web接口进行消息推送和配置修改。 ## 功能 1. **WebSocket协议支持**:完整实现WebSocket协议,包括握手、帧处理和连接管理 这里只支持WebSocket协议的长连接,不支持HTTP长连接, 需要自己实现websocket协议 2. **客户端管理**:对象管理客户端状态 每个客户端 有一个对象 来管理客户端的状态 例子: ``` struct ngx_ev_client_t { ngx_str_t id; // 客户端ID ngx_uint_t group_id; // 客户端所属组ID ngx_uint_t status; // 客户端状态 0: 连接中 1: 已连接 ngx_uint_t login_status; // 登录状态 0: 未登录 1: 已登录 ngx_uint_t read_buf_size; // 读取缓冲区大小 ngx_uint_t write_buf_size; // 写入缓冲区大小 ngx_uint_t heartbeat_interval; // 心跳时间间隔,默认60秒 }; 1) 生成客户端ID与登录操作 1. 生成客户端的ID 是一个字符串,因为客户端的ID 是一个字符串,所以要使用 ngx_str_t 来存储客户端的ID 2. 当前服务器属于长连接服务器,如果当前接入客户端没有客户端ID,那么发送当前客户端发送过来的数据与证书转发服务转发信息到一个web接口,服务会反馈一个客户端ID 给客户端,客户端需要存储这个ID 3. 当前服务器属于长连接服务器,如果有客户端ID,并且处于未登录的状态的时候,那么客户端需要在登录时提供这个客户端ID,那么发送当前客户端发送过来的数据与证书转发服务转发信息到一个web接口,服务会反馈一个客户端ID 给客户端,客户端需要存储这个ID 4. 以上2,3 核心功能是计算客户端ID 与登录的时候 验证客户端证书 2) 1. 当前是基于websocket协议的长连接,有一个心跳时间的概念,心跳时间是指客户端与服务器之间保持连接的时间间隔,默认是60秒,客户端需要在心跳时间内发送一个心跳包,服务器需要在心跳时间内收到一个心跳包,如果客户端没有发送心跳包,那么服务器会认为客户端断开了连接,会将客户端从组中移除。 2. 这里收到心跳时间, 会调用 一个web接口 包含信息 - 客户端ID - 心跳时间间隔 - 客户端状态 - 心跳包 3) 1. 这里收到客户端发送的数据与应答消息都是JSON, 答应一个数据 包含信息 - 客户端ID - 心跳时间间隔 example1: 客户端存在ID, 并且处于登录的状态的时候 客户端发送数据: { "id": "123456", // 客户端ID "heartbeat_interval": 60, // 心跳时间间隔 "data": "hello_world", // 客户端数据 "type": "notify" // 数据类型 "ctx" : "111111111", // 上下文 "token": "11111111111" // 客户端token } 服务器返回数据: { "id": "123456", // 客户端ID "heartbeat_interval": 60, // 心跳时间间隔 "type": "notify", // 数据类型 "ctx" : "111111111" // 上下文 "token": "11111111111" // 客户端token } example2: 客户端不存在ID, 并且处于未登录的状态的时候 客户端发送数据: { "id": "", // 客户端ID "heartbeat_interval": 60, // 心跳时间间隔 "data":"hello_world", // 客户端数据 "type":"auth" // 数据类型 "ctx" :"111111111" // 上下文 } 服务器返回数据: { "id": "123456", // 客户端ID "heartbeat_interval": 60, // 心跳时间间隔 "type": "auth", // 数据类型 "ctx" : "111111111", // 上下文 "token": "11111111111" // 客户端token } example3: 客户端存在ID, 并且处于未登录的状态的时候 客户端发送数据: { "id": "123456", // 客户端ID "heartbeat_interval": 60, // 心跳时间间隔 "data":"hello_world", // 客户端数据 "type":"auth" // 数据类型 "ctx" :"111111111" // 上下文 } 服务器返回数据: { "id": "123456", // 客户端ID "heartbeat_interval": 60, // 心跳时间间隔 "type": "auth", // 数据类型 "ctx" : "111111111", // 上下文 "token": "11111111111" // 客户端token } 2. 这里收到心跳包, 答应一个心跳包 包含信息 - 客户端ID - 心跳时间间隔 - 当前服务器时间 example: 客户端存在ID, 并且处于登录的状态的时候 客户端发送数据: { "id": "123456", // 客户端ID "heartbeat_interval": 60, // 心跳时间间隔 "data": "hello_world", // 客户端数据 "type": "heartbeat" // 数据类型 "ctx" : "111111111", // 上下文 "token": "11111111111" // 客户端token } 服务器返回数据: { "id": "123456", // 客户端ID "heartbeat_interval": 60, // 心跳时间间隔 "type": "heartbeat", // 数据类型 "ctx" : "111111111" // 上下文 "token": "11111111111" // 客户端token } 3. 这里接收服务器消息, { "id": "123456", // 客户端ID "data": "hello_world", // 客户端数据 "type": "execute" // 数据类型 } 4. type 有多个存在, 分别对应不同的功能 - 认证通信包 客户端与服务器都存在 认证通信包使用2个URL ev_auth_url ev_heartbeat_url - notify: 通知客户端, 用于客户端接收服务器发送的消息 - auth: 认证客户端, 用于客户端登录服务器 - heartbeat: 心跳包, 用于客户端保持与服务器的连接 - 单向通信包 服务器向客户端发送 为客户端发送"任务包",客户端返回"任务结果包" 单向通信包使用 ev_proxy_url 作为转发URL - execute: 任务包, 用于转发服务器发送任务给客户端 - result: 任务结果包, 用于客户端返回任务执行结果 - 双向通信包 客户端与服务器 都存在发送 包不负责应答 双向通信包使用 ev_proxy_url 作为转发URL - notify: 通知包, 用于转发服务器发送通知给客户端 - error: 错误包, 用于转发服务器发送错误信息给客户端 - setting: 设置包, 用于客户端设置与服务器的连接参数 - close: 关闭包, 用于客户端关闭与服务器的连接 3. **组管理**:支持将客户端分组,可通过组名进行批量操作 4. **Web接口**:提供HTTP接口用于: - 添加客户端到组 - 移除客户端从组 - 查询客户端在那个组 - 修改客户端配置 1.读取数据大小, 默认最大64KB,可通过配置或Web接口动态修改 2.心跳时间间隔, 默认60秒,可通过配置或Web接口动态修改 3.心跳包数据大小, 默认最大48KB,可通过配置或Web接口动态修改 - 修改整个组配置 1.读取数据大小, 默认最大64KB,可通过配置或Web接口动态修改 2.心跳时间间隔, 默认60秒,可通过配置或Web接口动态修改 3.心跳包数据大小, 默认最大48KB,可通过配置或Web接口动态修改 - 删除客户端配置 - 删除整个组配置 - 添加客户端配置 - 查询客户端配置 - 向单个客户端推送消息 - 向整个组推送消息 - 向所有客户端推送消息 - 对单个客户端支持服务短线,当客户端断开连接时,自动从组中移除 - 对整个组支持服务短线,当客户端断开连接时,自动从组中移除 - 对所有客户端支持服务短线,当客户端断开连接时,自动从组中移除 5. **服务转发功能**:支持多种服务转发方式(HTTPS, HTTP, 自定义协议),当服务器接收客户端数据时会自动发送服务转发信息 6. **ngx_ev_core_module** 这个模块是HTTP级别的吧,因为要基于HTTP协议 实现websocket 进行通信 修改 ngx_ev_core_module.c 模块配置 加载 读取 用于 功能1 实现 ngx_ev.c 与 ngx_push.c 客户端ID管理 与 websocket 处理函数 用于 功能2 与 功能3 实现 ngx_ev_http_handle.c 消息推送 用于 功能4 实现 ngx_proxy.c 服务转发 用于 功能5 实现 代码可以拆分 没个文件最大在300行左右