From 1a89e17abd67573b84d521d6ace39b82d64da3a0 Mon Sep 17 00:00:00 2001 From: PuerNya Date: Tue, 19 Nov 2024 18:44:25 +0800 Subject: [PATCH] two improves of live room danmu (#5) * feat: use wss instead of tcp connect * feat: fallback to next server when live room danmu server connect failed --- lib/pages/live_room/controller.dart | 7 +++++-- lib/tcp/live.dart | 30 +++++++++++++++++++---------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/lib/pages/live_room/controller.dart b/lib/pages/live_room/controller.dart index 49d57f8d..73e95c3f 100644 --- a/lib/pages/live_room/controller.dart +++ b/lib/pages/live_room/controller.dart @@ -142,12 +142,15 @@ class LiveRoomController extends GetxController { if (v['status']) { LiveDanmakuInfo info = v['data']; // logger.d("info => $info"); + List servers = []; + for (final host in info.data.hostList) { + servers.add('wss://${host.host}:${host.wssPort}/sub'); + } msgStream = LiveMessageStream( streamToken: info.data.token, roomId: roomId, uid: GStorage.userInfo.get('userInfoCache')?.mid ?? 0, - host: info.data.hostList[0].host, - port: info.data.hostList[0].port, + servers: servers, ); msgStream?.addEventListener((obj) { if (obj['cmd'] == 'DANMU_MSG') { diff --git a/lib/tcp/live.dart b/lib/tcp/live.dart index 839eb05f..b5990dc1 100644 --- a/lib/tcp/live.dart +++ b/lib/tcp/live.dart @@ -4,6 +4,7 @@ import 'dart:typed_data'; import 'package:PiliPalaX/services/loggeer.dart'; import 'package:brotli/brotli.dart'; +import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; class PackageHeader { int totalSize; @@ -150,16 +151,16 @@ class HeartbeatPackage extends AbstractPackage { } class LiveMessageStream { - String streamToken, host; - int roomId, uid, port; + String streamToken; + int roomId, uid; + List servers; List eventListeners = []; LiveMessageStream( {required this.streamToken, required this.roomId, required this.uid, - required this.host, - required this.port}); - late Socket socket; + required this.servers}); + late WebSocket socket; bool heartBeat = true; PiliLogger logger = getLogger(); final String logTag = "LiveStreamService"; @@ -185,12 +186,20 @@ class LiveMessageStream { final marshaledData = authPackage.marshal(); logger.d(marshaledData); - try { - socket = await Socket.connect(host, port); - logger.d('$logTag ===> TCP连接建立'); + Future getSocket() async { + for (final server in servers) { + try { + return await WebSocket.connect(server); + } catch (e) {} + } + throw Exception("all servers connect failed"); + } + + socket = await getSocket(); + // logger.d('$logTag ===> TCP连接建立'); socket.add(authPackage.marshal()); - logger.d('$logTag ===> 发送认证包'); + // logger.d('$logTag ===> 发送认证包'); await for (var data in socket) { PackageHeader? header = PackageHeader.fromBytesData(data); if (header != null) { @@ -222,7 +231,8 @@ class LiveMessageStream { } socket.close(); } catch (e) { - logger.i('$logTag ===> TCP连接失败: $e'); + SmartDialog.showToast("弹幕地址链接失败"); + // logger.i('$logTag ===> TCP连接失败: $e'); } }