import 'dart:async'; import 'dart:io'; // import '../util/logger.dart'; enum WebsocketServerStatus { starting, started, stopping, stopped, } typedef WebSocketMessageHandler = void Function(dynamic message); typedef WebSocketStatusHandler = void Function(WebsocketServerStatus status); class WebsocketServerWrap { HttpServer? _server; WebsocketServerStatus _status = WebsocketServerStatus.stopped; WebsocketServerStatus get status => _status; String? _serverAddress; String? get serverAddress => _serverAddress; // 用于向 UI 推送事件 final StreamController _eventController = StreamController.broadcast(); Stream get events => _eventController.stream; // 保存所有活跃的客户端连接(可选) final List _activeSockets = []; WebsocketServerWrap(); // 启动服务器 Future start({int port = 8080}) async { if (_status == WebsocketServerStatus.starting || _status == WebsocketServerStatus.started || _status == WebsocketServerStatus.stopping) { return; } _updateStatus(WebsocketServerStatus.starting); try { _server = await HttpServer.bind(InternetAddress.anyIPv4, port); _serverAddress = 'ws://${_server?.address.host}:$port'; _updateStatus(WebsocketServerStatus.started); // Log.d('🚀 WebSocket 服务器已启动: ws://${_server?.address.host}:$port'); await for (HttpRequest request in _server!) { if (WebSocketTransformer.isUpgradeRequest(request)) { final socket = await WebSocketTransformer.upgrade(request); _handleNewConnection(socket, request); } } } catch (error) { // Log.e('$error'); } } void _handleNewConnection(WebSocket socket, HttpRequest request) { final clientInfo = '🔌 客户端连接: ${request.connectionInfo?.remoteAddress}'; _eventController.add(clientInfo); _activeSockets.add(socket); // 记录活跃连接 socket.listen((message) { final msgLog = '📩 ${request.connectionInfo?.remoteAddress}: $message'; _eventController.add(msgLog); }, onDone: () { _eventController.add('❌ 客户端断开: ${request.connectionInfo?.remoteAddress}'); _activeSockets.remove(socket); // 移除断开连接 }, ); } // 停止服务器 Future stop() async { _updateStatus(WebsocketServerStatus.stopping); await _server?.close(); // _eventController.add('🛑 服务器已停止'); _activeSockets.clear(); // 清空所有连接 _updateStatus(WebsocketServerStatus.stopped); _server = null; _serverAddress = null; // Log.d('🛑 WebSocket 服务器已停止'); } void _updateStatus(WebsocketServerStatus status) { _status = status; String statusStr = ''; switch (status) { case WebsocketServerStatus.starting: statusStr = '正在启动...'; break; case WebsocketServerStatus.started: statusStr = '🚀 服务器已启动,监听端口: $_serverAddress'; break; case WebsocketServerStatus.stopping: statusStr = '正在关闭...'; break; case WebsocketServerStatus.stopped: statusStr = '🛑 服务器已关闭'; break; } _eventController.add(statusStr); } }