From 4fec26c1bac94b3b2398f3b6d0289243f4f7ddbf Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Sun, 3 Nov 2024 21:59:32 +0800 Subject: [PATCH] fix: live --- lib/pages/live_room/widgets/chat.dart | 10 ++-- lib/tcp/live.dart | 72 +++++++++++++++------------ 2 files changed, 44 insertions(+), 38 deletions(-) diff --git a/lib/pages/live_room/widgets/chat.dart b/lib/pages/live_room/widgets/chat.dart index e1575cd4..4e2b9740 100644 --- a/lib/pages/live_room/widgets/chat.dart +++ b/lib/pages/live_room/widgets/chat.dart @@ -18,7 +18,7 @@ class LiveRoomChat extends StatefulWidget { class _LiveRoomChatState extends State { final List _items = []; - late LiveMessageStream msgStream; + LiveMessageStream? msgStream; @override Widget build(BuildContext context) { @@ -47,11 +47,11 @@ class _LiveRoomChatState extends State { msgStream = LiveMessageStream( streamToken: info.data.token, roomId: widget.roomId, - uid: GStorage.userInfo.get('userInfoCache').mid ?? 0, + uid: GStorage.userInfo.get('userInfoCache')?.mid ?? 0, host: info.data.hostList[0].host, port: info.data.hostList[0].port, ); - msgStream.addEventListener((obj) { + msgStream?.addEventListener((obj) { if (obj['cmd'] == 'DANMU_MSG') { // logger.i(' 原始弹幕消息 ======> ${jsonEncode(obj)}'); setState(() { @@ -97,7 +97,7 @@ class _LiveRoomChatState extends State { }); } }); - msgStream.init(); + msgStream?.init(); } }); super.initState(); @@ -105,7 +105,7 @@ class _LiveRoomChatState extends State { @override void dispose() { - msgStream.close(); + msgStream?.close(); super.dispose(); } diff --git a/lib/tcp/live.dart b/lib/tcp/live.dart index ed0c9d2e..71a58693 100644 --- a/lib/tcp/live.dart +++ b/lib/tcp/live.dart @@ -47,9 +47,10 @@ class PackageHeader { return bytes.buffer.asUint8List(); } - static PackageHeader fromBytesData(Uint8List data) { + static PackageHeader? fromBytesData(Uint8List data) { if (data.length < 10) { - throw Exception("数据不足以解析PackageHeader"); + getLogger().i('数据不足以解析PackageHeader'); + return null; } final byteData = ByteData.sublistView(data); @@ -191,30 +192,32 @@ class LiveMessageStream { socket.add(authPackage.marshal()); logger.d('$logTag ===> 发送认证包'); await for (var data in socket) { - PackageHeader header = PackageHeader.fromBytesData(data); - List decompressedData = []; - //心跳包回复不用处理 - if (header.operationCode == 3) continue; - if (header.operationCode == 8) { - _heartBeat(); - } - try { - switch (header.protocolVer) { - case 0: - case 1: - _processingData(data); - continue; - case 2: - decompressedData = ZLibDecoder().convert(data.sublist(0x10)); - break; - case 3: - decompressedData = - const BrotliDecoder().convert(data.sublist(0x10)); - //print('Body: ${utf8.decode()}'); + PackageHeader? header = PackageHeader.fromBytesData(data); + if (header != null) { + List decompressedData = []; + //心跳包回复不用处理 + if (header.operationCode == 3) continue; + if (header.operationCode == 8) { + _heartBeat(); + } + try { + switch (header.protocolVer) { + case 0: + case 1: + _processingData(data); + continue; + case 2: + decompressedData = ZLibDecoder().convert(data.sublist(0x10)); + break; + case 3: + decompressedData = + const BrotliDecoder().convert(data.sublist(0x10)); + //print('Body: ${utf8.decode()}'); + } + _processingData(decompressedData); + } catch (e) { + logger.w(e); } - _processingData(decompressedData); - } catch (e) { - logger.w(e); } } socket.close(); @@ -225,14 +228,17 @@ class LiveMessageStream { void _processingData(List data) { try { - var subHeader = PackageHeader.fromBytesData(Uint8List.fromList(data)); - var msgBody = - utf8.decode(data.sublist(subHeader.headerSize, subHeader.totalSize)); - for (var f in eventListeners) { - f(jsonDecode(msgBody)); - } - if (subHeader.totalSize < data.length) { - _processingData(data.sublist(subHeader.totalSize)); + PackageHeader? subHeader = + PackageHeader.fromBytesData(Uint8List.fromList(data)); + if (subHeader != null) { + var msgBody = utf8 + .decode(data.sublist(subHeader.headerSize, subHeader.totalSize)); + for (var f in eventListeners) { + f(jsonDecode(msgBody)); + } + if (subHeader.totalSize < data.length) { + _processingData(data.sublist(subHeader.totalSize)); + } } } catch (e) { logger.e('ParseHeader错误: $e');