fix:同步调试echo分包逻辑代码、增加同一个会话时保持messageId进行递增

This commit is contained in:
liyi 2024-12-19 14:48:19 +08:00
parent 094e4c1662
commit f2ea43e4ab
9 changed files with 263 additions and 88 deletions

BIN
assets/test.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

View File

@ -54,7 +54,7 @@ class _StarChartPageState extends State<StarChartPage> {
width: 1.sw,
height: 1.sh,
color: Colors.transparent,
child: _buildTalkView(isMpeg4: false),
child: _buildTalkView(isMpeg4: true),
),
),
);

View File

@ -1,6 +1,7 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:star_lock/app_settings/app_colors.dart';
@ -219,6 +220,14 @@ class _StarLockMainPageState extends State<StarLockMainPage>
SizedBox(
height: 160.h,
),
SubmitBtn(
btnName: '发送回声测试'.tr,
onClick: () async {
String assetPath = 'assets/test.jpg'; //
List<int> imageBytes = await loadAssetImageAsBytes(assetPath);
StartChartManage().sendEchoMessage(payload: imageBytes);
},
),
if (F.isLite)
Container()
else
@ -247,6 +256,22 @@ class _StarLockMainPageState extends State<StarLockMainPage>
});
}
Future<List<int>> loadAssetImageAsBytes(String assetPath) async {
try {
//
ByteData byteData = await rootBundle.load(assetPath);
// ByteData Uint8List
Uint8List uint8List = byteData.buffer.asUint8List();
//
return uint8List.toList();
} catch (e) {
print('从资产加载图片时发生错误: $e');
rethrow;
}
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);

View File

@ -16,17 +16,39 @@ import 'package:star_lock/talk/startChart/proto/talk_reject.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart';
class MessageCommand {
// ToPeerId messageId
static Map<String, int> _messageIdMap = {};
static int _maxIntValue = 9223372036854775807; // Dart int
// ID
static int getNextMessageId(String toPeerId, {bool increment = true}) {
if (_messageIdMap.containsKey(toPeerId)) {
if (increment) {
_messageIdMap[toPeerId] = _messageIdMap[toPeerId]! + 1;
// messageId int 1
if (_messageIdMap[toPeerId]! > _maxIntValue) {
_messageIdMap[toPeerId] = 1;
}
}
} else {
_messageIdMap[toPeerId] = 1;
}
return _messageIdMap[toPeerId]!;
}
/// 线
static List<int> goOnlineRelay({
required String FromPeerId,
required String ToPeerId,
int? MessageId,
}) {
String serializedBytesString = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: 'hello',
@ -41,19 +63,22 @@ class MessageCommand {
static List<int> echoMessage({
required String ToPeerId,
required String FromPeerId,
List<int>? payload,
int? SpTotal,
int? SpIndex,
int? MessageId,
}) {
String payload = 'hello';
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: SpTotal,
SpIndex: SpIndex,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
PayloadCRC: calculationCrc(_stringToUint8List(payload)),
PayloadLength: payload.length,
PayloadCRC: calculationCrcFromIntList(payload ?? []),
PayloadLength: payload?.length ?? 0,
PayloadType: PayloadTypeConstant.echoTest,
);
String serializedBytesString = message.serialize();
@ -64,14 +89,15 @@ class MessageCommand {
static List<int> heartbeatMessage({
required String FromPeerId,
required String ToPeerId,
int? MessageId,
}) {
String payload = 'hello';
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -89,6 +115,7 @@ class MessageCommand {
required String FromPeerId,
required String ToPeerId,
required int time,
int? MessageId,
}) {
//
final gatewayResetReq = GatewayResetReq(
@ -100,9 +127,9 @@ class MessageCommand {
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -118,15 +145,16 @@ class MessageCommand {
static List<int> talkAcceptMessage({
required String FromPeerId,
required String ToPeerId,
int? MessageId,
}) {
final talkAcceptReq = TalkAcceptReq();
final payload = talkAcceptReq.writeToBuffer();
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -142,15 +170,16 @@ class MessageCommand {
static List<int> talkRequestMessage({
required String FromPeerId,
required String ToPeerId,
int? MessageId,
}) {
final talkReq = TalkReq();
final payload = talkReq.writeToBuffer();
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -166,15 +195,16 @@ class MessageCommand {
static List<int> talkRejectMessage({
required String FromPeerId,
required String ToPeerId,
int? MessageId,
}) {
final talkReject = TalkReject();
final payload = talkReject.writeToBuffer();
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -190,15 +220,16 @@ class MessageCommand {
static List<int> talkPingMessage({
required String FromPeerId,
required String ToPeerId,
int? MessageId,
}) {
final talkPing = TalkPing();
final payload = talkPing.writeToBuffer();
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -214,15 +245,16 @@ class MessageCommand {
static List<int> talkHangupMessage({
required String FromPeerId,
required String ToPeerId,
int? MessageId,
}) {
final talkHangup = TalkHangup();
final payload = talkHangup.writeToBuffer();
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -239,14 +271,15 @@ class MessageCommand {
required String FromPeerId,
required String ToPeerId,
required TalkData talkData,
int? MessageId,
}) {
final payload = talkData.writeToBuffer();
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.RealTimeData,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -263,14 +296,15 @@ class MessageCommand {
required String FromPeerId,
required String ToPeerId,
required TalkExpect talkExpect,
int? MessageId,
}) {
final payload = talkExpect.writeToBuffer();
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Req,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -287,6 +321,7 @@ class MessageCommand {
required String FromPeerId,
required String ToPeerId,
required int PayloadType,
int? MessageId,
}) {
final genericResp = GenericResp();
genericResp.message = 'ok';
@ -295,9 +330,9 @@ class MessageCommand {
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Resp,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -314,6 +349,7 @@ class MessageCommand {
required String FromPeerId,
required String ToPeerId,
required int PayloadType,
int? MessageId,
}) {
final genericResp = GenericResp();
genericResp.message = 'error';
@ -322,9 +358,9 @@ class MessageCommand {
ScpMessage message = ScpMessage(
ProtocolFlag: ProtocolFlagConstant.scp01,
MessageType: MessageTypeConstant.Resp,
MessageId: 1,
SpTotal: 0,
SpIndex: 0,
MessageId: MessageId,
SpTotal: 1,
SpIndex: 1,
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
Payload: payload,
@ -351,6 +387,15 @@ class MessageCommand {
return crc32Value;
}
// List<int>
static int calculationCrcFromIntList(List<int> intList) {
// List<int> Uint8List
final Uint8List uint8Payload = Uint8List.fromList(intList);
// calculationCrc
return calculationCrc(uint8Payload);
}
// Uint8List
static Uint8List _stringToUint8List(String input) {
return Uint8List.fromList(utf8.encode(input));

View File

@ -1,4 +1,5 @@
import 'dart:convert';
import 'package:protobuf/protobuf.dart';
import 'package:star_lock/app_settings/app_settings.dart';
import 'package:star_lock/talk/startChart/constant/message_type_constant.dart';
import 'package:star_lock/talk/startChart/constant/payload_type_constant.dart';
@ -20,6 +21,10 @@ import 'package:star_lock/talk/startChart/proto/talk_reject.pb.dart';
import 'package:star_lock/talk/startChart/proto/talk_request.pb.dart';
class ScpMessage {
///
/// keyMessageId
static Map<int, List<int>> _buffer = {};
ScpMessage({
this.ProtocolFlag,
this.MessageType,
@ -163,7 +168,9 @@ class ScpMessage {
static ScpMessage deserialize(List<int> bytes) {
final message = ScpMessage();
int offset = 0;
_log(
text:
'原始字节数组: ${bytes.sublist(0, 20).map((b) => b.toRadixString(16)).join(" ")}');
// ProtocolFlag (4 bytes)
if (bytes.length - offset >= 4) {
message.ProtocolFlag = utf8.decode(bytes.sublist(offset, offset + 4));
@ -253,7 +260,6 @@ class ScpMessage {
if (message.PayloadLength != null &&
bytes.length - offset >= message.PayloadLength!) {
final sublist = bytes.sublist(offset, offset + message.PayloadLength!);
// print('sublist:$sublist');
offset += message.PayloadLength!;
message.Payload = _handlePayLoad(
payloadType: message.PayloadType ?? 0,
@ -261,6 +267,9 @@ class ScpMessage {
byte: sublist,
offset: offset,
PayloadLength: message.PayloadLength,
spIndex: message.SpIndex,
spTotal: message.SpTotal,
messageId: message.MessageId,
);
} else {
throw FormatException("Invalid Payload or PayloadLength");
@ -269,20 +278,6 @@ class ScpMessage {
return message;
}
static String bytesToHex(List<int> bytes) {
return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join('');
}
// 16
static List<int> hexToBytes(String hexString) {
final bytes = <int>[];
for (int i = 0; i < hexString.length; i += 2) {
final hexByte = hexString.substring(i, i + 2);
bytes.add(int.parse(hexByte, radix: 16));
}
return bytes;
}
// payloadType序列化对应的payload结构体
static dynamic _handlePayLoad({
required int payloadType,
@ -290,6 +285,9 @@ class ScpMessage {
required List<int> byte,
int? offset,
int? PayloadLength,
int? spTotal,
int? spIndex,
int? messageId,
}) {
try {
switch (payloadType) {
@ -430,8 +428,22 @@ class ScpMessage {
final GenericResp genericResp = GenericResp.fromBuffer(byte);
return genericResp;
} else if (messageType == MessageTypeConstant.RealTimeData) {
final TalkData talkData = TalkData.fromBuffer(byte);
return talkData;
if (spTotal != null && spTotal > 1) {
//
final List<int> subPackageBytes = _subPackage(
spTotal: spTotal!,
spIndex: spIndex!,
bytes: byte,
messageId: messageId!,
);
//
final TalkData talkData = TalkData.fromBuffer(subPackageBytes);
return talkData;
} else {
//
final TalkData talkData = TalkData.fromBuffer(byte);
return talkData;
}
} else {
String payload = utf8.decode(byte);
return payload;
@ -453,13 +465,57 @@ class ScpMessage {
return payload;
}
} catch (e) {
_log(text: '❌反序列化udp数据时遇到错误----》$e');
String payload = utf8.decode(byte);
return payload;
// _log(text: '❌反序列化udp数据时遇到错误----》$e');
// //
_log(
text:
'原始字节数组: ${byte.sublist(0, 20).map((b) => b.toRadixString(16)).join(" ")}');
//
// // Protobuf相关的异常
// if (e is InvalidProtocolBufferException || e is FormatException) {
// _log(
// text:
// '反序列化失败的payloadType: $payloadType, messageType: $messageType');
// }
return '';
}
}
static String bytesToHex(List<int> bytes) {
return bytes.map((byte) => byte.toRadixString(16).padLeft(2, '0')).join('');
}
// 16
static List<int> hexToBytes(String hexString) {
final bytes = <int>[];
for (int i = 0; i < hexString.length; i += 2) {
final hexByte = hexString.substring(i, i + 2);
bytes.add(int.parse(hexByte, radix: 16));
}
return bytes;
}
static void _log({required String text}) {
AppLog.log('=====${text}');
}
///
static List<int> _subPackage({
required int messageId,
required int spTotal,
required int spIndex,
required List<int> bytes,
}) {
if (_buffer.containsKey(messageId)) {
// key就追加
final List<int> bytesList = _buffer[messageId]!;
bytesList.addAll(bytes);
_buffer[messageId] = bytesList;
} else {
// key
_buffer.putIfAbsent(messageId, () => bytes);
}
return [];
}
}

View File

@ -26,10 +26,11 @@ class UdpTalkAcceptHandler extends ScpMessageBaseHandle
//
final GenericResp genericResp = scpMessage.Payload;
if (checkGenericRespSuccess(genericResp)) {
//
_handleStartTalkPing();
// 2
Future.delayed(Duration(seconds: 2), () {
Future.delayed(Duration(seconds: 4), () {
//
_handleStartTalkPing();
//
_handleStartSendTalkExpectDataRequest();
//

View File

@ -53,7 +53,7 @@ class UdpTalkDataHandler extends ScpMessageBaseHandle
/// h264协议的数据
void _handleVideoH264(TalkData talkData) {
talkDataRepository.addTalkData(talkData);
// talkDataRepository.addTalkData(talkData);
}
///

View File

@ -31,7 +31,6 @@ class OverTimeTimerManager {
//
void receiveMessage() {
print("Received a message, resetting the timer.");
startTimer();
}

View File

@ -75,10 +75,12 @@ class StartChartManage {
int talkDataIntervalTime = 10; // (ms)
Timer? talkDataTimer; //
final int _maxPayloadSize = 50 * 1024; //
//
TalkExpect defaultTalkExpect = TalkExpect(
videoType: [TalkExpect_VideoTypeE.H264],
audioType: [TalkExpect_AudioTypeE.G711],
videoType: [TalkExpect_VideoTypeE.IMAGE],
audioType: [],
);
//
@ -153,14 +155,19 @@ class StartChartManage {
}
if (relayInfoEntity.relay_list != null &&
relayInfoEntity.relay_list!.length != 0) {
final data = relayInfoEntity.relay_list?[0];
final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? '');
remoteHost = parseUdpUrl['host'] ?? '';
remotePort = parseUdpUrl['port'] ?? '';
relayPeerId = data?.peerID ?? '';
ToPeerId = relayPeerId;
_log(text: '中继信息----》${relayInfoEntity}');
relayInfoEntity.relay_list!.length > 0) {
for (int i = 0; i <= relayInfoEntity.relay_list!.length; i++) {
final data = relayInfoEntity.relay_list?[i];
if (data?.peerID != FromPeerId) {
final parseUdpUrl = _parseUdpUrl(data?.listenAddr ?? '');
remoteHost = parseUdpUrl['host'] ?? '';
remotePort = parseUdpUrl['port'] ?? '';
relayPeerId = data?.peerID ?? '';
ToPeerId = relayPeerId;
_log(text: '中继信息----》${relayInfoEntity}');
break;
}
}
} else {
_log(text: '未查询到中继信息----》');
}
@ -217,6 +224,7 @@ class StartChartManage {
final message = MessageCommand.goOnlineRelay(
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -231,6 +239,7 @@ class StartChartManage {
final message = MessageCommand.talkRequestMessage(
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -242,6 +251,7 @@ class StartChartManage {
FromPeerId: FromPeerId,
ToPeerId: ToPeerId,
talkData: talkData,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -260,6 +270,8 @@ class StartChartManage {
final List<int> message = MessageCommand.heartbeatMessage(
FromPeerId: FromPeerId,
ToPeerId: relayPeerId,
MessageId:
MessageCommand.getNextMessageId(relayPeerId, increment: true),
);
await _sendMessage(message: message);
},
@ -268,13 +280,42 @@ class StartChartManage {
}
//
void sendEchoMessage() async {
final message = MessageCommand.echoMessage(
ToPeerId: echoPeerId,
FromPeerId: FromPeerId,
);
await _sendMessage(message: message);
_log(text: '发送回声测试消息');
void sendEchoMessage({required List<int> payload}) async {
String toPeerId = '2vzXdjdzipJBpWpJxhiRzCFXrDKk54t3YJ7EjYPSRuij';
final int totalPackets = (payload.length / _maxPayloadSize).ceil();
for (int i = 0; i < totalPackets; i++) {
int start = i * _maxPayloadSize;
int end = (i + 1) * _maxPayloadSize;
if (end > payload.length) {
end = payload.length;
}
List<int> packet = payload.sublist(start, end);
final message = MessageCommand.echoMessage(
ToPeerId: toPeerId,
FromPeerId: FromPeerId,
payload: packet,
SpTotal: totalPackets,
SpIndex: i + 1,
MessageId: MessageCommand.getNextMessageId(toPeerId, increment: false),
);
await _sendMessage(message: message);
_log(
text:
'发送回声测试消息=====SpTotal:$totalPackets,SpIndex:${i + 1},packet:${packet.length}');
}
// id
MessageCommand.getNextMessageId(toPeerId);
// final message = MessageCommand.echoMessage(
// ToPeerId: echoPeerId,
// FromPeerId: FromPeerId,
// payload: [],
// SpIndex: 0,
// SpTotal: 0,
// );
// await _sendMessage(message: message);
// _log(text: '发送回声测试消息');
}
//
@ -285,6 +326,7 @@ class StartChartManage {
FromPeerId: FromPeerId,
gatewayId: gatewayId,
time: DateTime.now().millisecondsSinceEpoch ~/ 1000,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -294,6 +336,7 @@ class StartChartManage {
final message = MessageCommand.talkAcceptMessage(
ToPeerId: ToPeerId,
FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
talkStatus.setWaitingAnswer();
@ -304,6 +347,7 @@ class StartChartManage {
final message = MessageCommand.talkRejectMessage(
ToPeerId: ToPeerId,
FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -314,6 +358,7 @@ class StartChartManage {
ToPeerId: ToPeerId,
FromPeerId: FromPeerId,
talkExpect: talkExpect,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -327,6 +372,7 @@ class StartChartManage {
ToPeerId: ToPeerId,
FromPeerId: FromPeerId,
PayloadType: PayloadType,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -340,6 +386,7 @@ class StartChartManage {
ToPeerId: ToPeerId,
FromPeerId: FromPeerId,
PayloadType: PayloadType,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -350,6 +397,7 @@ class StartChartManage {
final message = MessageCommand.talkPingMessage(
ToPeerId: ToPeerId,
FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -359,6 +407,7 @@ class StartChartManage {
final message = MessageCommand.talkHangupMessage(
ToPeerId: ToPeerId,
FromPeerId: FromPeerId,
MessageId: MessageCommand.getNextMessageId(ToPeerId, increment: true),
);
await _sendMessage(message: message);
}
@ -405,7 +454,7 @@ class StartChartManage {
message, InternetAddress(remoteHost), remotePort);
if (result != message.length) {
AppLog.log('❌Udp send data error----> $result ${message.length}');
_udpSocket = null;
// _udpSocket = null;
}
}
@ -742,7 +791,7 @@ class StartChartManage {
handler.handleInvalidReq(scpMessage);
}
} catch (e) {
_log(text: '❌ 处理udp返回数据时遇到错误---> $e');
// _log(text: '❌ 处理udp返回数据时遇到错误---> $e');
}
}