| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- import 'dart:async';
- import 'dart:io';
- import 'dart:convert';
- // import '../util/logger.dart';
- enum HttpServerStatus {
- starting,
- started,
- stopping,
- stopped,
- }
- typedef HttpRequestHandler = Future<void> 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<String> _eventController = StreamController.broadcast();
- Stream<String> get events => _eventController.stream;
- // // 保存所有活跃的客户端连接(可选)
- // final List<WebSocket> _activeSockets = [];
- // 请求处理器
- HttpRequestHandler? _requestHandler;
- HttpServerWrap();
- // 启动服务器
- Future<void> 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<void> _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<void> 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);
- }
- }
|