fix: live

This commit is contained in:
bggRGjQaUbCoE
2024-11-03 21:59:32 +08:00
parent 39e335549c
commit 4fec26c1ba
2 changed files with 44 additions and 38 deletions

View File

@@ -18,7 +18,7 @@ class LiveRoomChat extends StatefulWidget {
class _LiveRoomChatState extends State<LiveRoomChat> { class _LiveRoomChatState extends State<LiveRoomChat> {
final List<Widget> _items = []; final List<Widget> _items = [];
late LiveMessageStream msgStream; LiveMessageStream? msgStream;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@@ -47,11 +47,11 @@ class _LiveRoomChatState extends State<LiveRoomChat> {
msgStream = LiveMessageStream( msgStream = LiveMessageStream(
streamToken: info.data.token, streamToken: info.data.token,
roomId: widget.roomId, roomId: widget.roomId,
uid: GStorage.userInfo.get('userInfoCache').mid ?? 0, uid: GStorage.userInfo.get('userInfoCache')?.mid ?? 0,
host: info.data.hostList[0].host, host: info.data.hostList[0].host,
port: info.data.hostList[0].port, port: info.data.hostList[0].port,
); );
msgStream.addEventListener((obj) { msgStream?.addEventListener((obj) {
if (obj['cmd'] == 'DANMU_MSG') { if (obj['cmd'] == 'DANMU_MSG') {
// logger.i(' 原始弹幕消息 ======> ${jsonEncode(obj)}'); // logger.i(' 原始弹幕消息 ======> ${jsonEncode(obj)}');
setState(() { setState(() {
@@ -97,7 +97,7 @@ class _LiveRoomChatState extends State<LiveRoomChat> {
}); });
} }
}); });
msgStream.init(); msgStream?.init();
} }
}); });
super.initState(); super.initState();
@@ -105,7 +105,7 @@ class _LiveRoomChatState extends State<LiveRoomChat> {
@override @override
void dispose() { void dispose() {
msgStream.close(); msgStream?.close();
super.dispose(); super.dispose();
} }

View File

@@ -47,9 +47,10 @@ class PackageHeader {
return bytes.buffer.asUint8List(); return bytes.buffer.asUint8List();
} }
static PackageHeader fromBytesData(Uint8List data) { static PackageHeader? fromBytesData(Uint8List data) {
if (data.length < 10) { if (data.length < 10) {
throw Exception("数据不足以解析PackageHeader"); getLogger().i('数据不足以解析PackageHeader');
return null;
} }
final byteData = ByteData.sublistView(data); final byteData = ByteData.sublistView(data);
@@ -191,30 +192,32 @@ class LiveMessageStream {
socket.add(authPackage.marshal()); socket.add(authPackage.marshal());
logger.d('$logTag ===> 发送认证包'); logger.d('$logTag ===> 发送认证包');
await for (var data in socket) { await for (var data in socket) {
PackageHeader header = PackageHeader.fromBytesData(data); PackageHeader? header = PackageHeader.fromBytesData(data);
List<int> decompressedData = []; if (header != null) {
//心跳包回复不用处理 List<int> decompressedData = [];
if (header.operationCode == 3) continue; //心跳包回复不用处理
if (header.operationCode == 8) { if (header.operationCode == 3) continue;
_heartBeat(); if (header.operationCode == 8) {
} _heartBeat();
try { }
switch (header.protocolVer) { try {
case 0: switch (header.protocolVer) {
case 1: case 0:
_processingData(data); case 1:
continue; _processingData(data);
case 2: continue;
decompressedData = ZLibDecoder().convert(data.sublist(0x10)); case 2:
break; decompressedData = ZLibDecoder().convert(data.sublist(0x10));
case 3: break;
decompressedData = case 3:
const BrotliDecoder().convert(data.sublist(0x10)); decompressedData =
//print('Body: ${utf8.decode()}'); 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(); socket.close();
@@ -225,14 +228,17 @@ class LiveMessageStream {
void _processingData(List<int> data) { void _processingData(List<int> data) {
try { try {
var subHeader = PackageHeader.fromBytesData(Uint8List.fromList(data)); PackageHeader? subHeader =
var msgBody = PackageHeader.fromBytesData(Uint8List.fromList(data));
utf8.decode(data.sublist(subHeader.headerSize, subHeader.totalSize)); if (subHeader != null) {
for (var f in eventListeners) { var msgBody = utf8
f(jsonDecode(msgBody)); .decode(data.sublist(subHeader.headerSize, subHeader.totalSize));
} for (var f in eventListeners) {
if (subHeader.totalSize < data.length) { f(jsonDecode(msgBody));
_processingData(data.sublist(subHeader.totalSize)); }
if (subHeader.totalSize < data.length) {
_processingData(data.sublist(subHeader.totalSize));
}
} }
} catch (e) { } catch (e) {
logger.e('ParseHeader错误: $e'); logger.e('ParseHeader错误: $e');