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> _msgController = StreamController.broadcast(); Stream> get stream => _msgController.stream; ///开始连接 Future 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(); } }