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

172 lines
6.4 KiB
Markdown
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 延迟测试优化总结
## 🎯 优化目标
解决延迟测试的问题:
- **开启代理后**: 可以正常获取节点的延迟信息
- **不开启代理时**: 无法获取节点延迟,因为网络请求被代理拦截
**解决方案**: 在不开启代理时使用本机网络直接ping节点IP来获取延迟信息。
## 🔧 优化内容
### **1. 优化延迟测试主逻辑**
#### **修改位置**: `kr_urlTest()` 方法
#### **优化内容**:
- **明确区分测试方式**: 根据连接状态选择不同的测试方法
- **已连接状态**: 使用 SingBox 通过代理测试延迟
- **未连接状态**: 使用本机网络直接ping节点IP测试延迟
```dart
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个节点
- **错误处理**: 完善的错误处理和统计
```dart
/// 未连接状态下的延迟测试使用本机网络直接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秒
- **详细错误分类**: 区分不同类型的连接错误
- **更清晰的日志**: 明确标识使用本机网络测试
```dart
/// 测试单个节点的延迟使用本机网络直接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. **改善用户体验**: 无论是否连接代理都能看到节点延迟
现在用户可以在未连接代理的情况下通过本机网络直接测试节点延迟获得准确的延迟信息