| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- 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<String> _eventController = StreamController.broadcast();
- Stream<String> get events => _eventController.stream;
- // 保存所有活跃的客户端连接(可选)
- final List<WebSocket> _activeSockets = [];
- WebsocketServerWrap();
- // 启动服务器
- Future<void> 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<void> 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);
- }
- }
|