LighthouseApp/LATENCY_TEST_OPTIMIZATION_SUMMARY.md
speakeloudest 75d4c48e41
Some checks failed
Build Windows / build (push) Has been cancelled
feat: 源码提交
2025-10-19 23:30:54 -07:00

6.4 KiB
Executable File
Raw Blame History

延迟测试优化总结

🎯 优化目标

解决延迟测试的问题:

  • 开启代理后: 可以正常获取节点的延迟信息
  • 不开启代理时: 无法获取节点延迟,因为网络请求被代理拦截

解决方案: 在不开启代理时使用本机网络直接ping节点IP来获取延迟信息。

🔧 优化内容

1. 优化延迟测试主逻辑

修改位置: kr_urlTest() 方法

优化内容:

  • 明确区分测试方式: 根据连接状态选择不同的测试方法
  • 已连接状态: 使用 SingBox 通过代理测试延迟
  • 未连接状态: 使用本机网络直接ping节点IP测试延迟
if (kr_isConnected.value) {
  // 已连接状态:使用 SingBox 通过代理测试
  KRLogUtil.kr_i('🔗 已连接状态 - 使用 SingBox 通过代理测试延迟', tag: 'HomeController');
  await KRSingBoxImp.instance.kr_urlTest("select");
} else {
  // 未连接状态使用本机网络直接ping节点IP
  KRLogUtil.kr_i('🔌 未连接状态 - 使用本机网络直接ping节点IP测试延迟', tag: 'HomeController');
  KRLogUtil.kr_i('🌐 这将绕过代理,直接使用本机网络连接节点', tag: 'HomeController');
  await _kr_testLatencyWithoutVpn();
}

2. 优化未连接状态延迟测试

修改位置: _kr_testLatencyWithoutVpn() 方法

优化内容:

  • 明确测试方式: 强调使用本机网络直接连接
  • 详细日志记录: 记录测试过程和结果统计
  • 结果展示: 显示延迟最低的前3个节点
  • 错误处理: 完善的错误处理和统计
/// 未连接状态下的延迟测试使用本机网络直接ping节点IP
Future<void> _kr_testLatencyWithoutVpn() async {
  KRLogUtil.kr_i('🔌 开始未连接状态延迟测试(使用本机网络)', tag: 'HomeController');
  KRLogUtil.kr_i('🌐 将使用本机网络直接连接节点IP进行延迟测试', tag: 'HomeController');
  
  // 获取所有非auto节点
  final testableNodes = kr_subscribeService.allList
      .where((item) => item.tag != 'auto')
      .toList();
  
  // 并行执行所有测试任务
  await Future.wait(testTasks);
  
  // 统计测试结果
  final successCount = testableNodes.where((item) => item.urlTestDelay.value < 65535).length;
  final failCount = testableNodes.length - successCount;
  
  KRLogUtil.kr_i('📊 测试结果: 成功 $successCount 个,失败 $failCount 个', tag: 'HomeController');
}

3. 优化单个节点测试方法

修改位置: _kr_testSingleNode() 方法

优化内容:

  • 明确测试方式: 强调使用本机网络直接连接(绕过代理)
  • 增加超时时间: 从5秒增加到8秒
  • 调整延迟阈值: 从3秒调整到5秒
  • 详细错误分类: 区分不同类型的连接错误
  • 更清晰的日志: 明确标识使用本机网络测试
/// 测试单个节点的延迟使用本机网络直接ping节点IP
Future<void> _kr_testSingleNode(dynamic item) async {
  KRLogUtil.kr_i('🔌 使用本机网络直接连接测试(绕过代理)', tag: 'NodeTest');
  
  // 创建Socket连接使用本机网络不经过代理
  final socket = await Socket.connect(
    address,
    port,
    timeout: const Duration(seconds: 8), // 增加超时时间到8秒
  );
  
  // 设置延迟阈值超过5秒认为节点不可用
  if (delay > 5000) {
    item.urlTestDelay.value = 65535;
    KRLogUtil.kr_w('⚠️ 节点 ${item.tag} 延迟过高: ${delay}ms标记为不可用', tag: 'NodeTest');
  } else {
    // 使用本机网络测试的延迟结果
    item.urlTestDelay.value = delay;
    KRLogUtil.kr_i('✅ 节点 ${item.tag} 本机网络延迟测试成功: ${delay}ms', tag: 'NodeTest');
  }
}

🎯 优化效果

解决的问题:

  1. 代理拦截问题: 未连接时使用本机网络直接连接,绕过代理拦截
  2. 延迟测试不准确: 使用本机网络直接ping节点IP获得真实的网络延迟
  3. 测试方式不明确: 明确区分代理测试和直连测试
  4. 错误处理不完善: 增加详细的错误分类和处理

预期改善:

  1. 未连接状态: 可以正常获取节点延迟信息
  2. 测试准确性: 使用本机网络测试,获得更准确的延迟数据
  3. 用户体验: 无论是否连接代理,都能看到节点延迟
  4. 调试能力: 详细的日志记录,便于问题排查

📊 测试场景

测试场景1: 未连接状态延迟测试

  • 预期行为: 使用本机网络直接连接节点IP
  • 验证要点:
    • 日志显示"使用本机网络直接连接测试(绕过代理)"
    • 能够获取到节点的真实延迟
    • 延迟值合理(通常 < 5000ms

测试场景2: 已连接状态延迟测试

  • 预期行为: 使用 SingBox 通过代理测试
  • 验证要点:
    • 日志显示"使用 SingBox 通过代理测试延迟"
    • 通过代理获取延迟信息
    • 测试结果正确显示

测试场景3: 网络异常处理

  • 预期行为: 正确处理连接超时、拒绝、不可达等情况
  • 验证要点:
    • 超时节点标记为不可用65535
    • 错误日志详细记录错误类型
    • 测试继续进行,不影响其他节点

🔍 关键日志点

测试开始:

  • 🔌 开始未连接状态延迟测试(使用本机网络)
  • 🌐 将使用本机网络直接连接节点IP进行延迟测试

单个节点测试:

  • 🔌 使用本机网络直接连接测试(绕过代理)
  • ⏱️ 本机网络连接延迟: XXXms
  • ✅ 节点 XXX 本机网络延迟测试成功: XXXms

测试结果:

  • 📊 测试结果: 成功 X 个,失败 X 个
  • 🏆 延迟最低的前3个节点:

错误处理:

  • ⏰ 节点 XXX 连接超时
  • 🚫 节点 XXX 连接被拒绝
  • 🌐 节点 XXX 网络不可达

📝 总结

通过这次优化,我们解决了延迟测试的核心问题:

  1. 明确区分测试方式: 根据连接状态选择代理测试或直连测试
  2. 使用本机网络: 未连接时直接ping节点IP绕过代理拦截
  3. 提高测试准确性: 获得真实的网络延迟数据
  4. 完善错误处理: 详细的错误分类和日志记录
  5. 改善用户体验: 无论是否连接代理,都能看到节点延迟

现在用户可以在未连接代理的情况下,通过本机网络直接测试节点延迟,获得准确的延迟信息!