fix:增加组包时的最大组包超时时间
This commit is contained in:
parent
a20206dfaf
commit
4ab5d77473
@ -1,3 +1,4 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:audioplayers/audioplayers.dart';
|
||||
@ -22,6 +23,8 @@ class ScpMessageBaseHandle {
|
||||
/// 分包缓冲区
|
||||
// 存储每个 messageId 对应的分包数据
|
||||
static Map<int, List<List<int>>> _packetBuffer = {};
|
||||
final Map<int, Timer> _packetTimers = {};
|
||||
final Duration _timeoutDuration = Duration(seconds: 10); // 分包组包最大超时时间
|
||||
|
||||
// 通话数据流的单例流数据处理类
|
||||
final TalkDataRepository talkDataRepository = TalkDataRepository.instance;
|
||||
@ -74,7 +77,7 @@ class ScpMessageBaseHandle {
|
||||
|
||||
/// 处理分包逻辑
|
||||
/// 如果没有收到所有包则返回null
|
||||
dynamic handleFragmentedPayload({
|
||||
dynamic handleFragmentedPayload({
|
||||
required int messageId,
|
||||
required int spTotal,
|
||||
required int spIndex,
|
||||
@ -84,6 +87,7 @@ class ScpMessageBaseHandle {
|
||||
// 初始化分包列表
|
||||
if (!_packetBuffer.containsKey(messageId)) {
|
||||
_packetBuffer[messageId] = List.filled(spTotal, []);
|
||||
_startTimer(messageId);
|
||||
}
|
||||
|
||||
// 检查分包索引是否在合法范围内
|
||||
@ -102,7 +106,7 @@ class ScpMessageBaseHandle {
|
||||
_packetBuffer[messageId]!.expand((packet) => packet).toList();
|
||||
|
||||
// 清除已重组的分包数据
|
||||
_packetBuffer.remove(messageId);
|
||||
_clearPacketData(messageId);
|
||||
|
||||
// 解析完整的 payload
|
||||
if (payloadType == PayloadTypeConstant.talkData) {
|
||||
@ -120,4 +124,18 @@ class ScpMessageBaseHandle {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// 启动定时器
|
||||
void _startTimer(int messageId) {
|
||||
_packetTimers[messageId]?.cancel();
|
||||
_packetTimers[messageId] = Timer(_timeoutDuration, () {
|
||||
_clearPacketData(messageId);
|
||||
});
|
||||
}
|
||||
|
||||
// 清除分包数据和定时器
|
||||
void _clearPacketData(int messageId) {
|
||||
_packetBuffer.remove(messageId);
|
||||
_packetTimers.remove(messageId)?.cancel();
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user