mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
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
This commit is contained in:
@@ -142,12 +142,15 @@ class LiveRoomController extends GetxController {
|
||||
if (v['status']) {
|
||||
LiveDanmakuInfo info = v['data'];
|
||||
// logger.d("info => $info");
|
||||
List<String> 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') {
|
||||
|
||||
@@ -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<dynamic> {
|
||||
}
|
||||
|
||||
class LiveMessageStream {
|
||||
String streamToken, host;
|
||||
int roomId, uid, port;
|
||||
String streamToken;
|
||||
int roomId, uid;
|
||||
List<String> servers;
|
||||
List<void Function(dynamic obj)> 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<WebSocket> 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');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user