import 'dart:async'; import 'dart:io'; import 'dart:convert'; // import '../utils/logger.dart'; enum HttpServerStatus { starting, started, stopping, stopped, } typedef HttpRequestHandler = Future Function(HttpRequest request); typedef HttpServerStatusHandler = void Function(HttpServerStatus status); class HttpServerWrap { HttpServer? _server; HttpServerStatus _status = HttpServerStatus.stopped; HttpServerStatus get status => _status; String? _serverAddress; String? get serverAddress => _serverAddress; // 用于向 UI 推送事件 final StreamController _eventController = StreamController.broadcast(); Stream get events => _eventController.stream; // // 保存所有活跃的客户端连接(可选) // final List _activeSockets = []; // 请求处理器 HttpRequestHandler? _requestHandler; HttpServerWrap(); // 启动服务器 Future start({int port = 8080, HttpRequestHandler? requestHandler}) async { if (_status == HttpServerStatus.starting || _status == HttpServerStatus.started || _status == HttpServerStatus.stopping) { return; } _requestHandler = requestHandler; _updateStatus(HttpServerStatus.starting); try { _server = await HttpServer.bind(InternetAddress.anyIPv4, port); _serverAddress = 'http://${_server?.address.host}:$port'; _updateStatus(HttpServerStatus.started); // Log.d('🚀 HTTP 服务器已启动: $_serverAddress'); await for (HttpRequest request in _server!) { _handleRequest(request); } } catch (error) { // Log.e('$error'); _updateStatus(HttpServerStatus.stopped, message: '$error'); } } Future _handleRequest(HttpRequest request) async { try { final clientInfo = '🔌 请求来自: ${request.connectionInfo?.remoteAddress} ${request.method} ${request.uri}'; _eventController.add(clientInfo); if (_requestHandler != null) { await _requestHandler!(request); } else { // 默认响应 request.response ..statusCode = HttpStatus.ok ..headers.contentType = ContentType.json ..write(jsonEncode({'message': 'Hello from test server'})) ..close(); } } catch (e) { request.response ..statusCode = HttpStatus.internalServerError ..write('Error processing request: $e') ..close(); } } // 停止服务器 Future stop() async { _updateStatus(HttpServerStatus.stopping); await _server?.close(); _updateStatus(HttpServerStatus.stopped); _server = null; _serverAddress = null; // Log.d('🛑 WebSocket 服务器已停止'); } void _updateStatus(HttpServerStatus status, {String? message}) { _status = status; String statusStr = ''; switch (status) { case HttpServerStatus.starting: statusStr = '正在启动...'; break; case HttpServerStatus.started: statusStr = '🚀 服务器已启动,监听端口: $_serverAddress'; break; case HttpServerStatus.stopping: statusStr = '正在关闭...'; break; case HttpServerStatus.stopped: statusStr = '🛑 服务器已关闭'; if (message != null) { statusStr += ': $message'; } break; } _eventController.add(statusStr); } }