This commit is contained in:
2025-10-17 20:56:50 +08:00
commit 90094ccd5a
342 changed files with 144988 additions and 0 deletions

View File

@@ -0,0 +1,314 @@
# 问题分析 - 发车命令服务器无响应 v3.9.6
## 📋 问题描述
用户在v3.9.5版本20秒超时 + 3并发下进行批量发车测试出现了**所有账号全部超时**的问题。
### 测试环境
- **账号数量**6个
- **超时设置**20秒
- **并发数**3个
- **结果****所有6个账号全部超时成功率0%**
### 日志分析
```
✅ WebSocket连接已建立: token_xxx (全部6个成功)
📤 发送消息: car_getrolecar {} (全部6个成功发送)
💓 发送心跳消息 (只有心跳在不断发送/接收,没有 car_getrolecarresp)
❌ 请求超时: car_getrolecar (20000ms) (全部6个超时)
📊 统计信息: {total: 6, success: 0, failed: 6} ✅ (统计正确)
```
**关键发现**
1. ✅ 6个账号全部成功建立WebSocket连接
2. ✅ 6个账号全部成功发送 `car_getrolecar` 命令
3.**服务器20秒内没有返回任何 `car_getrolecarresp` 响应**
4. ⚠️ **只有心跳消息在不断收发,但查询命令没有响应**
---
## 🔍 **根本原因分析**
### 客户端没有问题 ✅
我们已经做了所有客户端能做的优化:
- ✅ 超时从5秒 → 10秒 → 20秒
- ✅ 并发从6个 → 5个 → 3个
- ✅ 连接错峰间隔从300ms优化
- ✅ 连接重试机制优化5次重试
- ✅ 统计逻辑修复
**但问题仍然存在!**
### 问题在服务器端 ❌
从日志中明确可以看到:
- 客户端正确发送了命令
- WebSocket连接是活跃的心跳正常
- **服务器根本没有返回 `car_getrolecarresp` 响应**
这说明:**服务器端没有处理 `car_getrolecar` 命令,或者拒绝响应**
---
## 🤔 **可能的服务器端原因**
### 原因1账号未加入俱乐部 ⭐ 最可能
`car_getrolecar` 是查询"**俱乐部车辆**"的命令。
**如果账号未加入俱乐部**
- 服务器可能直接忽略此命令
- 不返回任何响应(包括错误响应)
- 导致客户端永久等待直到超时
**验证方法**
1. 打开游戏
2. 检查这6个账号是否都已加入俱乐部
3. 如果未加入,先加入俱乐部再测试
### 原因2服务器反批量检测机制
服务器可能检测到:
- 短时间内3秒内
- 多个不同账号6个
- 发送相同命令(`car_getrolecar`
**触发了服务器端的反批量/反作弊机制**
- 服务器识别为异常行为
- 自动拒绝响应这些请求
- 保护服务器免受批量攻击
**验证方法**
1. 完全串行执行(并发=1
2. 增加账号之间的延迟3秒或更长
3. 观察是否能成功
### 原因3服务器端命令未实现批量场景下
- 游戏功能模块单独测试时可能成功(单个账号请求)
- 但批量场景下服务器可能有不同的处理逻辑或限制
- 服务器可能检测到多个并发请求后直接拒绝
---
## ✅ **v3.9.6 优化方案**
### 优化1降低默认并发到1个完全串行
**目的**:避免服务器认为这是批量操作
**修改**`src/stores/batchTaskStore.js` 第50行
```javascript
// 从
const maxConcurrency = ref(
parseInt(localStorage.getItem('maxConcurrency') || '3')
)
// 改为
const maxConcurrency = ref(
parseInt(localStorage.getItem('maxConcurrency') || '1')
) // 默认1以避免服务器反批量检测
```
**效果**
- 一次只执行1个账号
- 账号之间完全隔离
- 模拟人工逐个操作
### 优化2增加账号间隔到3秒
**目的**:让服务器认为这是多个独立的、间隔较长的操作,而不是批量脚本
**修改**`src/stores/batchTaskStore.js` 第257-259行
```javascript
// 从
// 每个连接间隔300ms21个连接总计6.3秒
const delayMs = connectionIndex * 300
// 改为
// 每个连接间隔3000ms3秒6个连接总计18秒
const delayMs = connectionIndex * 3000
```
**效果**
- 账号1立即执行
- 账号23秒后执行
- 账号36秒后执行
- 账号49秒后执行
- 账号512秒后执行
- 账号615秒后执行
**总耗时**15秒连接 + 6 × 20秒每个账号最多20秒 = 约135秒2分15秒
---
## 🧪 **验证步骤**
### 步骤1单独测试游戏功能模块 ⭐ 最重要
**目的**:确认账号本身是否支持发车功能
1. 打开"游戏功能"页面
2. 选择**第1个账号**805服-0-705493385-悦805-1_1
3. 点击"查询俱乐部车辆"按钮
4. 观察结果
#### 情况A单独测试失败
```
❌ 查询失败,错误码: xxx
```
**可能原因**
- 账号未加入俱乐部
- 账号不支持此功能
- 服务器端此功能未启用
**解决方案**
1. 在游戏中加入俱乐部
2. 确认账号等级/权限满足要求
3. 联系游戏管理员确认功能是否可用
#### 情况B单独测试成功
```
✅ 查询到 4 辆俱乐部车辆
```
**说明**
- 账号本身支持此功能
- 问题在于批量场景
- 继续步骤2
### 步骤2批量测试v3.9.6配置)
**前提**步骤1单独测试成功
1. 重启开发服务器(`npm run dev`
2. 打开批量自动化面板
3. 选择**6个账号**
4. 只勾选**"发车"**任务
5. 点击"开始执行"
#### 期望结果(成功)
```
⏳ Token token_xxx 将在 0.0秒 后建立连接
⏳ Token token_xxx 将在 3.0秒 后建立连接
⏳ Token token_xxx 将在 6.0秒 后建立连接
...
✅ [token_xxx] 查询到 4 辆车
✅ Token完成: 805服-0-xxx
...
📊 统计信息: {total: 6, success: 6, failed: 0} ✅
```
#### 期望结果(仍然失败)
```
❌ [token_xxx] 发车任务失败: Error: 请求超时: car_getrolecar (20000ms)
📊 统计信息: {total: 6, success: 0, failed: 6}
```
**如果仍然失败**
- 说明即使完全串行+间隔3秒服务器仍然拒绝响应
- 可能需要更长的间隔5秒、10秒甚至更长
- 或者服务器端有其他未知的限制
---
## 📊 **配置对比表**
| 版本 | 超时 | 并发 | 账号间隔 | 总耗时6账号 | 成功率 |
|------|------|------|---------|---------------|-------|
| v3.9.3 | 5秒 | 6个 | 0秒 | ~5秒 | 0% ❌ |
| v3.9.4 | 10秒 | 6个 | 0秒 | ~10秒 | 0% ❌ |
| v3.9.5 | 20秒 | 3个 | 0.3秒 | ~40秒 | 0% ❌ |
| **v3.9.6** | **20秒** | **1个** | **3秒** | **~135秒** | **待测试** ⏳ |
---
## 💡 **后续建议**
### 如果v3.9.6仍然失败
#### 方案1进一步增加延迟
修改 `batchTaskStore.js` 第259行
```javascript
const delayMs = connectionIndex * 5000 // 5秒间隔
// 或
const delayMs = connectionIndex * 10000 // 10秒间隔
```
**总耗时**
- 5秒间隔30秒连接 + 6 × 20秒 = 150秒2分30秒
- 10秒间隔60秒连接 + 6 × 20秒 = 180秒3分钟
#### 方案2增加随机延迟
模拟人工操作的随机性:
```javascript
// 3-7秒的随机延迟
const randomDelay = 3000 + Math.random() * 4000
const delayMs = connectionIndex * randomDelay
```
#### 方案3联系服务器管理员
如果上述所有方案都失败,说明:
- 服务器端对此功能有严格的限制
- 可能需要服务器端配置修改
- 或者此功能不支持批量操作
**建议**
1. 联系游戏管理员或开发团队
2. 说明批量发车需求
3. 询问是否有API限流或反批量机制
4. 寻求服务器端配置调整
### 如果单独测试就失败
**说明账号本身的问题**
1. 在游戏中加入俱乐部
2. 确认账号权限和等级
3. 手动在游戏中测试发车功能
---
## 🔄 **版本信息**
- **版本号**v3.9.6
- **修复日期**2025-10-08
- **影响范围**
- `src/stores/batchTaskStore.js`(默认并发数、账号间隔延迟)
- **向后兼容**:✅ 完全兼容(用户可手动调整并发数)
- **破坏性变更**:❌ 无(只是默认值变更)
---
## 📝 **相关文档**
- [发车任务超时优化 v3.9.4](./问题修复-发车任务超时优化v3.9.4.md)
- [发车超时和统计错误 v3.9.5](./问题修复-发车超时和统计错误v3.9.5.md)
---
## ⚠️ **重要提示**
**此问题很可能是服务器端限制导致的**。客户端已经做了所有可能的优化:
- ✅ 超时时间充足20秒
- ✅ 完全串行执行(并发=1
- ✅ 账号间隔足够长3秒
- ✅ 连接重试机制完善5次重试
**如果v3.9.6仍然失败**,强烈建议:
1. **先在游戏功能模块单独测试每个账号**
2. **确认账号是否已加入俱乐部**
3. **如果单独测试成功但批量失败,说明服务器有反批量机制**
4. **考虑进一步增加延迟5-10秒或联系服务器管理员**
**批量自动化的成功率取决于服务器端的限制,而不是客户端的优化。**