Files
xueguang_flutter_app/lib/websocket/room_websocket.dart
2025-11-19 23:20:51 +08:00

64 lines
1.3 KiB
Dart

import 'dart:async';
import 'dart:io';
import 'package:logger/logger.dart';
Logger logger = Logger();
class RoomWebSocket {
///单例设计模式
RoomWebSocket._();
static final RoomWebSocket _instance = RoomWebSocket._();
factory RoomWebSocket() => _instance;
/// WebSocket和心跳定时器
String url = "";
WebSocket? _socket;
Timer? _heartbeatTimer;
///用 StreamController 分化消息给订阅者
final StreamController<Map<String, dynamic>> _msgController = StreamController.broadcast();
Stream<Map<String, dynamic>> get stream => _msgController.stream;
///开始连接
Future<void> connect() async {
try {
_socket = await WebSocket.connect(url);
//监听消息
_socket!.listen(
(data) {},
onDone: () {},
onError: (_) {
logger.e("连接异常断开");
},
);
//心跳
_heartbeatTimer?.cancel();
_heartbeatTimer = Timer.periodic(Duration(seconds: 15), (_) {
logger.i("发送心跳");
});
} catch (e) {
_reconnect();
}
}
///发送指令
void send() {
_socket!.add("");
}
///连接错误事件
void _reconnect() {
logger.e("连接错误");
Future.delayed(Duration(seconds: 3), connect);
}
void dispose() {
_heartbeatTimer?.cancel();
_socket?.close();
_msgController.close();
}
}