6.4 KiB
Executable File
6.4 KiB
Executable File
延迟测试优化总结
🎯 优化目标
解决延迟测试的问题:
- 开启代理后: 可以正常获取节点的延迟信息
- 不开启代理时: 无法获取节点延迟,因为网络请求被代理拦截
解决方案: 在不开启代理时,使用本机网络直接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');
}
}
🎯 优化效果
解决的问题:
- 代理拦截问题: 未连接时使用本机网络直接连接,绕过代理拦截
- 延迟测试不准确: 使用本机网络直接ping节点IP,获得真实的网络延迟
- 测试方式不明确: 明确区分代理测试和直连测试
- 错误处理不完善: 增加详细的错误分类和处理
预期改善:
- 未连接状态: 可以正常获取节点延迟信息
- 测试准确性: 使用本机网络测试,获得更准确的延迟数据
- 用户体验: 无论是否连接代理,都能看到节点延迟
- 调试能力: 详细的日志记录,便于问题排查
📊 测试场景
测试场景1: 未连接状态延迟测试
- 预期行为: 使用本机网络直接连接节点IP
- 验证要点:
- 日志显示"使用本机网络直接连接测试(绕过代理)"
- 能够获取到节点的真实延迟
- 延迟值合理(通常 < 5000ms)
测试场景2: 已连接状态延迟测试
- 预期行为: 使用 SingBox 通过代理测试
- 验证要点:
- 日志显示"使用 SingBox 通过代理测试延迟"
- 通过代理获取延迟信息
- 测试结果正确显示
测试场景3: 网络异常处理
- 预期行为: 正确处理连接超时、拒绝、不可达等情况
- 验证要点:
- 超时节点标记为不可用(65535)
- 错误日志详细记录错误类型
- 测试继续进行,不影响其他节点
🔍 关键日志点
测试开始:
🔌 开始未连接状态延迟测试(使用本机网络)🌐 将使用本机网络直接连接节点IP进行延迟测试
单个节点测试:
🔌 使用本机网络直接连接测试(绕过代理)⏱️ 本机网络连接延迟: XXXms✅ 节点 XXX 本机网络延迟测试成功: XXXms
测试结果:
📊 测试结果: 成功 X 个,失败 X 个🏆 延迟最低的前3个节点:
错误处理:
⏰ 节点 XXX 连接超时🚫 节点 XXX 连接被拒绝🌐 节点 XXX 网络不可达
📝 总结
通过这次优化,我们解决了延迟测试的核心问题:
- 明确区分测试方式: 根据连接状态选择代理测试或直连测试
- 使用本机网络: 未连接时直接ping节点IP,绕过代理拦截
- 提高测试准确性: 获得真实的网络延迟数据
- 完善错误处理: 详细的错误分类和日志记录
- 改善用户体验: 无论是否连接代理,都能看到节点延迟
现在用户可以在未连接代理的情况下,通过本机网络直接测试节点延迟,获得准确的延迟信息!