123 lines
4.3 KiB
Markdown
Executable File
123 lines
4.3 KiB
Markdown
Executable File
# Connection Refused 问题分析和修复
|
||
|
||
## 🔍 问题现象
|
||
|
||
从日志中可以看到所有节点都出现 "Connection refused" 错误:
|
||
|
||
```
|
||
❌ 本机网络测试节点 德国 失败: SocketException: Connection refused (OS Error: Connection refused, errno = 111), address = 156.226.175.116, port = 51036
|
||
❌ 本机网络测试节点 美国 失败: SocketException: Connection refused (OS Error: Connection refused, errno = 111), address = 154.29.154.241, port = 59118
|
||
❌ 本机网络测试节点 英国 失败: SocketException: Connection refused (OS Error: Connection refused, errno = 111), address = 89.213.40.159, port = 45268
|
||
❌ 本机网络测试节点 台湾 失败: SocketException: Connection refused (OS Error: Connection refused, errno = 111), address = 83.147.12.27, port = 49826
|
||
❌ 本机网络测试节点 香港 失败: SocketException: Connection refused (OS Error: Connection refused, errno = 111), address = 156.224.78.176, port = 44782
|
||
```
|
||
|
||
## 🎯 问题分析
|
||
|
||
### **1. 地址解析问题**
|
||
|
||
#### **问题现象**:
|
||
- 所有节点的端口都是随机的大数字(如 51036, 59118, 45268 等)
|
||
- 这些端口看起来不像是正常的代理服务端口
|
||
|
||
#### **根本原因**:
|
||
- 原来的代码使用 `Uri.parse(item.serverAddr)` 来解析地址和端口
|
||
- 但是 `serverAddr` 可能不包含端口信息,或者解析逻辑有问题
|
||
- 端口应该从节点的配置中获取,而不是从 `serverAddr` 中解析
|
||
|
||
### **2. 配置获取问题**
|
||
|
||
#### **问题现象**:
|
||
- 没有从节点的配置中获取正确的端口号
|
||
- 使用了错误的默认端口或解析出的错误端口
|
||
|
||
#### **根本原因**:
|
||
- 节点的端口信息存储在 `item.config['server_port']` 中
|
||
- 原来的代码没有正确获取这个配置
|
||
|
||
## 🔧 修复方案
|
||
|
||
### **修复内容**:
|
||
|
||
1. **改进地址解析逻辑**:
|
||
```dart
|
||
// 从配置中获取正确的地址和端口
|
||
String address = item.serverAddr;
|
||
int port = 443; // 默认端口
|
||
|
||
// 如果serverAddr包含端口,先解析
|
||
if (item.serverAddr.contains(':')) {
|
||
final parts = item.serverAddr.split(':');
|
||
if (parts.length == 2) {
|
||
address = parts[0];
|
||
port = int.tryParse(parts[1]) ?? 443;
|
||
}
|
||
}
|
||
|
||
// 从配置中获取端口(优先级更高)
|
||
if (item.config != null && item.config['server_port'] != null) {
|
||
port = item.config['server_port'];
|
||
KRLogUtil.kr_i('📌 从配置获取端口: $port', tag: 'NodeTest');
|
||
}
|
||
```
|
||
|
||
2. **增加详细日志**:
|
||
```dart
|
||
KRLogUtil.kr_i('📋 节点配置: ${item.config}', tag: 'NodeTest');
|
||
KRLogUtil.kr_i('📍 最终地址: $address, 端口: $port', tag: 'NodeTest');
|
||
```
|
||
|
||
### **修复逻辑**:
|
||
|
||
1. **地址处理**:
|
||
- 首先使用 `item.serverAddr` 作为地址
|
||
- 如果包含端口,则分离地址和端口
|
||
- 否则使用默认端口 443
|
||
|
||
2. **端口获取**:
|
||
- 优先从 `item.config['server_port']` 获取端口
|
||
- 如果配置中没有端口,使用解析出的端口或默认端口
|
||
|
||
3. **日志记录**:
|
||
- 记录节点配置信息
|
||
- 记录最终使用的地址和端口
|
||
- 便于调试和问题排查
|
||
|
||
## 📊 预期效果
|
||
|
||
### **修复前**:
|
||
- 使用错误的端口(如 51036, 59118 等)
|
||
- 所有节点连接被拒绝
|
||
- 无法获取真实的延迟信息
|
||
|
||
### **修复后**:
|
||
- 使用正确的端口(从配置中获取)
|
||
- 能够成功连接到节点
|
||
- 获取真实的网络延迟
|
||
|
||
## 🔍 验证方法
|
||
|
||
### **1. 检查日志**:
|
||
- 查看 `📋 节点配置:` 日志,确认配置信息
|
||
- 查看 `📌 从配置获取端口:` 日志,确认端口获取
|
||
- 查看 `📍 最终地址:` 日志,确认最终使用的地址和端口
|
||
|
||
### **2. 测试连接**:
|
||
- 确认不再出现 "Connection refused" 错误
|
||
- 能够获取到合理的延迟值(通常 < 5000ms)
|
||
- 部分节点可能仍然超时,但应该有一些节点能够连接成功
|
||
|
||
### **3. 端口验证**:
|
||
- 确认使用的端口是合理的(如 443, 80, 8080 等)
|
||
- 不再使用随机的大数字端口
|
||
|
||
## 📝 总结
|
||
|
||
**问题根源**: 地址和端口解析逻辑错误,没有从节点配置中获取正确的端口信息。
|
||
|
||
**修复方案**: 改进地址解析逻辑,优先从节点配置中获取端口,并增加详细的日志记录。
|
||
|
||
**预期结果**: 能够使用正确的地址和端口连接节点,获取真实的网络延迟信息。
|
||
|
||
现在可以重新测试,应该能够看到正确的端口和成功的连接!
|