165 lines
5.5 KiB
Markdown
Executable File
165 lines
5.5 KiB
Markdown
Executable File
# Ping延迟测试逻辑确认
|
||
|
||
## 🎯 用户需求确认
|
||
|
||
**用户明确需求**:
|
||
1. **连接后的测速逻辑**: 保持不变,使用 SingBox 通过代理测试
|
||
2. **没连接前的测速逻辑**:
|
||
- 从接口获取节点信息
|
||
- 如果信息包含 `ip:端口` 格式,则只取 IP 部分
|
||
- 使用本机网络直接 ping 这个 IP 获取延迟
|
||
- 将 ping 的延迟作为节点延迟显示
|
||
|
||
## 📋 当前实现逻辑
|
||
|
||
### **1. 连接状态判断**
|
||
|
||
#### **主测试方法**: `kr_urlTest()`
|
||
```dart
|
||
if (kr_isConnected.value) {
|
||
// ✅ 连接后:保持默认测试规则,使用 SingBox 通过代理测试
|
||
KRLogUtil.kr_i('🔗 已连接状态 - 使用 SingBox 通过代理测试延迟', tag: 'HomeController');
|
||
await KRSingBoxImp.instance.kr_urlTest("select");
|
||
// 等待 SingBox 完成测试并获取结果
|
||
} else {
|
||
// ✅ 没连接前:使用本机网络直接ping节点IP
|
||
KRLogUtil.kr_i('🔌 未连接状态 - 使用本机网络直接ping节点IP测试延迟', tag: 'HomeController');
|
||
await _kr_testLatencyWithoutVpn();
|
||
}
|
||
```
|
||
|
||
### **2. 没连接前的Ping测试逻辑**
|
||
|
||
#### **Ping测试方法**: `_kr_testSingleNode()`
|
||
```dart
|
||
/// 测试单个节点的延迟(使用本机网络直接ping节点IP)
|
||
Future<void> _kr_testSingleNode(dynamic item) async {
|
||
// 从接口获取的节点信息中提取IP地址
|
||
String targetIp = item.serverAddr;
|
||
|
||
// 如果信息包含 ip:端口 格式,则只取IP部分
|
||
if (targetIp.contains(':')) {
|
||
final parts = targetIp.split(':');
|
||
if (parts.length == 2) {
|
||
targetIp = parts[0];
|
||
KRLogUtil.kr_i('📌 从 ip:端口 格式中提取IP: $targetIp', tag: 'NodeTest');
|
||
}
|
||
}
|
||
|
||
KRLogUtil.kr_i('🎯 目标IP地址: $targetIp', tag: 'NodeTest');
|
||
KRLogUtil.kr_i('🔌 使用本机网络直接ping IP地址(绕过代理)', tag: 'NodeTest');
|
||
|
||
// 使用本机网络直接ping IP地址测试延迟
|
||
final socket = await Socket.connect(
|
||
targetIp,
|
||
80, // 使用80端口进行ping测试
|
||
timeout: const Duration(seconds: 5), // 5秒超时
|
||
);
|
||
|
||
// 获取延迟时间
|
||
final delay = stopwatch.elapsedMilliseconds;
|
||
|
||
// 使用ping的延迟结果作为节点延迟
|
||
item.urlTestDelay.value = delay;
|
||
KRLogUtil.kr_i('✅ 节点 ${item.tag} ping测试成功: ${delay}ms', tag: 'NodeTest');
|
||
}
|
||
```
|
||
|
||
## ✅ 逻辑确认
|
||
|
||
### **连接后(kr_isConnected.value = true)**:
|
||
1. **保持默认测试规则**: 使用 `KRSingBoxImp.instance.kr_urlTest("select")`
|
||
2. **通过代理测试**: 使用 SingBox 的 URL 测试功能
|
||
3. **等待测试完成**: 等待3秒让 SingBox 完成测试
|
||
4. **获取测试结果**: 从 `KRSingBoxImp.instance.kr_activeGroups` 获取延迟信息
|
||
|
||
### **没连接前(kr_isConnected.value = false)**:
|
||
1. **从接口获取节点信息**: 使用 `item.serverAddr`
|
||
2. **提取IP地址**: 如果包含 `ip:端口` 格式,只取IP部分
|
||
3. **使用本机网络ping**: 使用 `Socket.connect()` 直接连接IP的80端口
|
||
4. **获取ping延迟**: 测量连接建立的时间作为延迟
|
||
5. **显示延迟结果**: 将ping延迟作为节点延迟显示
|
||
|
||
## 🔍 关键实现点
|
||
|
||
### **IP地址提取逻辑**:
|
||
```dart
|
||
// 从接口获取的节点信息中提取IP地址
|
||
String targetIp = item.serverAddr;
|
||
|
||
// 如果信息包含 ip:端口 格式,则只取IP部分
|
||
if (targetIp.contains(':')) {
|
||
final parts = targetIp.split(':');
|
||
if (parts.length == 2) {
|
||
targetIp = parts[0]; // 只取IP部分
|
||
}
|
||
}
|
||
```
|
||
|
||
### **Ping测试实现**:
|
||
```dart
|
||
// 使用Socket连接测试ping延迟(模拟ping)
|
||
final socket = await Socket.connect(
|
||
targetIp,
|
||
80, // 使用80端口进行ping测试
|
||
timeout: const Duration(seconds: 5), // 5秒超时
|
||
);
|
||
|
||
// 获取延迟时间
|
||
final delay = stopwatch.elapsedMilliseconds;
|
||
|
||
// 使用ping的延迟结果作为节点延迟
|
||
item.urlTestDelay.value = delay;
|
||
```
|
||
|
||
## 📊 测试场景
|
||
|
||
### **测试场景1: 连接代理时**
|
||
- **预期行为**: 使用 SingBox 通过代理测试(保持默认规则)
|
||
- **验证日志**: `🔗 已连接状态 - 使用 SingBox 通过代理测试延迟`
|
||
- **测试方式**: `KRSingBoxImp.instance.kr_urlTest("select")`
|
||
|
||
### **测试场景2: 没连接时**
|
||
- **预期行为**: 使用本机网络直接ping节点IP
|
||
- **验证日志**: `🔌 未连接状态 - 使用本机网络直接ping节点IP测试延迟`
|
||
- **IP提取**: `📌 从 ip:端口 格式中提取IP: XXX.XXX.XXX.XXX`
|
||
- **Ping测试**: `🎯 目标IP地址: XXX.XXX.XXX.XXX`
|
||
- **测试方式**: `Socket.connect(targetIp, 80)` 模拟ping
|
||
|
||
## 🔍 关键日志点
|
||
|
||
### **IP提取**:
|
||
- `📌 从 ip:端口 格式中提取IP: XXX.XXX.XXX.XXX`
|
||
- `🎯 目标IP地址: XXX.XXX.XXX.XXX`
|
||
|
||
### **Ping测试**:
|
||
- `🔌 使用本机网络直接ping IP地址(绕过代理)`
|
||
- `⏱️ 开始ping测试...`
|
||
- `⏱️ ping延迟: XXXms`
|
||
- `✅ 节点 XXX ping测试成功: XXXms`
|
||
|
||
### **错误处理**:
|
||
- `⏰ 节点 XXX ping超时`
|
||
- `🚫 节点 XXX ping被拒绝`
|
||
- `🌐 节点 XXX 网络不可达`
|
||
|
||
## 📝 总结
|
||
|
||
**✅ 当前实现完全符合用户需求**:
|
||
|
||
1. **连接后**: 保持默认测试规则,使用 SingBox 通过代理测试延迟
|
||
2. **没连接前**:
|
||
- 从接口获取节点信息
|
||
- 如果包含 `ip:端口` 格式,只取IP部分
|
||
- 使用本机网络直接ping IP地址
|
||
- 将ping延迟作为节点延迟显示
|
||
|
||
**🔧 实现特点**:
|
||
- 自动根据连接状态选择测试方式
|
||
- 智能提取IP地址(处理ip:端口格式)
|
||
- 使用80端口进行ping测试(更稳定)
|
||
- 详细的日志记录,便于调试
|
||
- 完善的错误处理和超时机制
|
||
|
||
**🎯 用户需求已完全实现!**
|