- 多订阅支持: 测试所有订阅的节点,不仅仅是单个订阅
- 直连测试: 不通过代理连接,使用本地网络直接测试节点服务器
- 全面信息: 显示节点所属订阅、剩余流量、延迟、可用性等
- 智能排序: 按延迟、按订阅、按地区等多维度排序
- 实时反馈: 详细的进度显示和状态反馈
-
遍历所有订阅配置
- 读取
profiles.yaml中的所有订阅项目 - 支持
remote、local、merge等类型 - 跳过系统配置项 (Script, Merge等)
- 读取
-
增强节点信息提取
struct EnhancedNodeInfo { node_name: String, // 节点名称 node_type: String, // 节点类型 (trojan, vless, ss等) server: String, // 服务器地址 port: u16, // 端口 profile_name: String, // 所属订阅名称 profile_uid: String, // 订阅UID profile_type: String, // 订阅类型 subscription_url: Option<String>, // 订阅链接 traffic_info: Option<TrafficInfo>, // 流量信息 } struct TrafficInfo { total: Option<u64>, // 总流量 (字节) used: Option<u64>, // 已用流量 (字节) remaining: Option<u64>, // 剩余流量 (字节) expire_time: Option<i64>, // 到期时间 (时间戳) }
-
TCP连接延迟测试
- 直接连接节点服务器IP:端口
- 多次测试取平均值 (3-5次)
- 超时控制 (5-10秒)
- 连接质量评估
-
可用性检测
- 端口开放检测
- 连接稳定性测试
- 响应时间统计
-
批量并发处理
- 分批处理 (6-8个节点/批次)
- 批次间间隔 (避免网络拥塞)
- 异步并发执行
-
订阅流量解析
- 解析订阅响应头中的流量信息
- 支持多种流量格式 (GB, MB, 百分比等)
- 缓存流量信息 (避免频繁请求)
-
流量状态计算
- 剩余流量百分比
- 流量使用趋势
- 到期时间倒计时
-
综合评分算法
fn calculate_node_score(node: &TestResult) -> f64 { let latency_score = calculate_latency_score(node.latency_ms); let availability_score = if node.is_available { 1.0 } else { 0.0 }; let stability_score = calculate_stability_score(&node.test_results); latency_score * 0.4 + availability_score * 0.3 + stability_score * 0.3 }
-
多维度排序
- 按综合评分排序
- 按延迟排序
- 按订阅分组排序
- 按地区分组排序
-
测试配置选项
- 并发数设置 (1-10个)
- 超时时间设置 (5-30秒)
- 测试轮数设置 (1-5轮)
- 订阅筛选 (选择要测试的订阅)
-
操作按钮
- 开始测试
- 暂停测试
- 停止测试
- 重新测试
-
实时进度条
- 总体进度 (所有节点)
- 当前批次进度
- 预计剩余时间
-
状态信息
- 当前测试的节点名称
- 当前测试的订阅
- 已完成/总数统计
- 成功/失败/超时统计
-
节点列表表格 | 排名 | 节点名称 | 订阅名称 | 延迟 | 状态 | 剩余流量 | 操作 | |------|----------|----------|------|------|----------|------| | 1 | 🇭🇰香港01 | 机场A | 23ms | ✅ | 85% | 使用 |
-
颜色编码系统
- 🟢 优秀 (<50ms)
- 🟡 良好 (50-150ms)
- 🟠 一般 (150-300ms)
- 🔴 较差 (>300ms)
- ⚫ 不可用
-
分组显示选项
- 按订阅分组
- 按地区分组
- 按延迟范围分组
- 全部显示
-
筛选器
- 按订阅筛选
- 按地区筛选
- 按状态筛选 (可用/不可用)
- 按延迟范围筛选
-
搜索功能
- 节点名称搜索
- 服务器地址搜索
- 模糊搜索支持
1. 用户点击"全局测速"
↓
2. 后端遍历所有订阅配置
↓
3. 解析每个订阅的节点信息
↓
4. 提取流量信息 (如果可用)
↓
5. 分批并发测试节点连通性
↓
6. 实时发送进度更新到前端
↓
7. 计算综合评分和排序
↓
8. 返回完整测试结果
↓
9. 前端展示结果和提供操作选项
-
异步并发处理
use tokio::time::{timeout, Duration}; use futures::future::join_all; async fn test_nodes_batch(nodes: Vec<NodeInfo>) -> Vec<TestResult> { let futures: Vec<_> = nodes.into_iter() .map(|node| timeout(Duration::from_secs(10), test_single_node(node))) .collect(); join_all(futures).await .into_iter() .map(|result| result.unwrap_or_else(|_| TestResult::timeout())) .collect() }
-
事件发射机制
// 进度更新 app_handle.emit("global-speed-test-progress", progress)?; // 单个节点完成 app_handle.emit("global-speed-test-node-complete", result)?; // 测试完成 app_handle.emit("global-speed-test-complete", summary)?;
-
状态管理
interface GlobalSpeedTestState { isRunning: boolean; progress: TestProgress; results: TestResult[]; summary: TestSummary | null; filters: FilterOptions; sortBy: SortOption; }
-
事件监听
useEffect(() => { const unlistenProgress = listen( "global-speed-test-progress", handleProgress, ); const unlistenComplete = listen( "global-speed-test-complete", handleComplete, ); return () => { unlistenProgress(); unlistenComplete(); }; }, []);
- 批量处理: 分批测试避免网络拥塞
- 连接池: 复用HTTP客户端
- 缓存机制: 缓存订阅流量信息
- 超时控制: 合理的超时设置
- 资源管理: 及时释放网络连接
- 内存优化: 大数据集分页处理
-
全面错误处理
- 网络错误 (连接超时、DNS解析失败)
- 配置错误 (格式错误、缺失字段)
- 系统错误 (内存不足、权限问题)
-
用户友好提示
- 详细的错误信息
- 操作建议
- 重试选项
-
测试中断处理
- 优雅的取消机制
- 部分结果保存
- 状态恢复
- 多订阅节点解析
- 直连网络测试
- 基本结果显示
- 流量信息集成
- 综合评分算法
- 高级筛选排序
- 详细进度反馈
- 测试配置选项
- 界面优化美化
预期成果: 一个功能完整、性能优秀、用户友好的全局节点测速系统,能够帮助用户快速找到最优节点。