172 lines
6.4 KiB
Markdown
Executable File
172 lines
6.4 KiB
Markdown
Executable File
# 延迟测试优化总结
|
||
|
||
## 🎯 优化目标
|
||
|
||
解决延迟测试的问题:
|
||
- **开启代理后**: 可以正常获取节点的延迟信息
|
||
- **不开启代理时**: 无法获取节点延迟,因为网络请求被代理拦截
|
||
|
||
**解决方案**: 在不开启代理时,使用本机网络直接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. **改善用户体验**: 无论是否连接代理,都能看到节点延迟
|
||
|
||
现在用户可以在未连接代理的情况下,通过本机网络直接测试节点延迟,获得准确的延迟信息!
|