95 lines
2.6 KiB
Dart
95 lines
2.6 KiB
Dart
import 'dart:collection';
|
||
|
||
class PacketLossStatistics {
|
||
static final PacketLossStatistics _instance =
|
||
PacketLossStatistics._internal();
|
||
factory PacketLossStatistics() => _instance;
|
||
PacketLossStatistics._internal();
|
||
|
||
// 记录每个messageId的分包信息
|
||
// key: messageId, value: {totalPackets, receivedPackets}
|
||
final Map<int, PacketInfo> _packetsMap = HashMap();
|
||
|
||
// 统计信息
|
||
int _totalMessages = 0; // 总消息数
|
||
int _lostMessages = 0; // 丢包的消息数
|
||
int _totalPackets = 0; // 总分包数
|
||
int _lostPackets = 0; // 丢失的分包数
|
||
|
||
// 记录分包数据
|
||
void recordPacket(int messageId, int currentIndex, int totalPackets) {
|
||
if (!_packetsMap.containsKey(messageId)) {
|
||
_packetsMap[messageId] = PacketInfo(totalPackets);
|
||
_totalMessages++;
|
||
_totalPackets += totalPackets;
|
||
}
|
||
|
||
_packetsMap[messageId]!.receivedPackets.add(currentIndex);
|
||
|
||
// 如果收到了该messageId的最后一个包,进行统计
|
||
if (currentIndex == totalPackets) {
|
||
_checkPacketLoss(messageId);
|
||
}
|
||
}
|
||
|
||
// 检查丢包情况
|
||
void _checkPacketLoss(int messageId) {
|
||
final info = _packetsMap[messageId]!;
|
||
|
||
// 检查是否有丢失的包
|
||
int received = info.receivedPackets.length;
|
||
if (received < info.totalPackets) {
|
||
_lostMessages++;
|
||
_lostPackets += (info.totalPackets - received);
|
||
}
|
||
|
||
// 清理该messageId的记录,避免内存泄漏
|
||
_packetsMap.remove(messageId);
|
||
}
|
||
|
||
// 获取丢包率统计信息
|
||
PacketLossInfo getStatistics() {
|
||
if (_totalMessages == 0 || _totalPackets == 0) {
|
||
return PacketLossInfo(0.0, 0.0);
|
||
}
|
||
|
||
// 计算消息级别的丢包率
|
||
double messageLossRate = (_lostMessages / _totalMessages) * 100;
|
||
|
||
// 计算分包级别的丢包率
|
||
double packetLossRate = (_lostPackets / _totalPackets) * 100;
|
||
|
||
return PacketLossInfo(messageLossRate, packetLossRate);
|
||
}
|
||
|
||
// 重置统计数据
|
||
void reset() {
|
||
_packetsMap.clear();
|
||
_totalMessages = 0;
|
||
_lostMessages = 0;
|
||
_totalPackets = 0;
|
||
_lostPackets = 0;
|
||
}
|
||
}
|
||
|
||
// 分包信息类
|
||
class PacketInfo {
|
||
final int totalPackets;
|
||
final Set<int> receivedPackets = HashSet<int>();
|
||
|
||
PacketInfo(this.totalPackets);
|
||
}
|
||
|
||
// 丢包统计信息类
|
||
class PacketLossInfo {
|
||
final double messageLossRate; // 消息丢失率
|
||
final double packetLossRate; // 分包丢失率
|
||
|
||
PacketLossInfo(this.messageLossRate, this.packetLossRate);
|
||
|
||
@override
|
||
String toString() {
|
||
return 'Message Loss Rate: ${messageLossRate.toStringAsFixed(2)}%, Packet Loss Rate: ${packetLossRate.toStringAsFixed(2)}%';
|
||
}
|
||
}
|