websocketServerWrap.dart 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import 'dart:async';
  2. import 'dart:io';
  3. // import '../utils/logger.dart';
  4. enum WebsocketServerStatus {
  5. starting,
  6. started,
  7. stopping,
  8. stopped,
  9. }
  10. typedef WebSocketMessageHandler = void Function(dynamic message);
  11. typedef WebSocketStatusHandler = void Function(WebsocketServerStatus status);
  12. class WebsocketServerWrap {
  13. HttpServer? _server;
  14. WebsocketServerStatus _status = WebsocketServerStatus.stopped;
  15. WebsocketServerStatus get status => _status;
  16. String? _serverAddress;
  17. String? get serverAddress => _serverAddress;
  18. // 用于向 UI 推送事件
  19. final StreamController<String> _eventController = StreamController.broadcast();
  20. Stream<String> get events => _eventController.stream;
  21. // 保存所有活跃的客户端连接(可选)
  22. final List<WebSocket> _activeSockets = [];
  23. WebsocketServerWrap();
  24. // 启动服务器
  25. Future<void> start({int port = 8080}) async {
  26. if (_status == WebsocketServerStatus.starting ||
  27. _status == WebsocketServerStatus.started ||
  28. _status == WebsocketServerStatus.stopping) {
  29. return;
  30. }
  31. _updateStatus(WebsocketServerStatus.starting);
  32. try {
  33. _server = await HttpServer.bind(InternetAddress.anyIPv4, port);
  34. _serverAddress = 'ws://${_server?.address.host}:$port';
  35. _updateStatus(WebsocketServerStatus.started);
  36. // Log.d('🚀 WebSocket 服务器已启动: ws://${_server?.address.host}:$port');
  37. await for (HttpRequest request in _server!) {
  38. if (WebSocketTransformer.isUpgradeRequest(request)) {
  39. final socket = await WebSocketTransformer.upgrade(request);
  40. _handleNewConnection(socket, request);
  41. }
  42. }
  43. } catch (error) {
  44. // Log.e('$error');
  45. }
  46. }
  47. void _handleNewConnection(WebSocket socket, HttpRequest request) {
  48. final clientInfo = '🔌 客户端连接: ${request.connectionInfo?.remoteAddress}';
  49. _eventController.add(clientInfo);
  50. _activeSockets.add(socket); // 记录活跃连接
  51. socket.listen((message) {
  52. final msgLog = '📩 ${request.connectionInfo?.remoteAddress}: $message';
  53. _eventController.add(msgLog);
  54. },
  55. onDone: () {
  56. _eventController.add('❌ 客户端断开: ${request.connectionInfo?.remoteAddress}');
  57. _activeSockets.remove(socket); // 移除断开连接
  58. },
  59. );
  60. }
  61. // 停止服务器
  62. Future<void> stop() async {
  63. _updateStatus(WebsocketServerStatus.stopping);
  64. await _server?.close();
  65. // _eventController.add('🛑 服务器已停止');
  66. _activeSockets.clear(); // 清空所有连接
  67. _updateStatus(WebsocketServerStatus.stopped);
  68. _server = null;
  69. _serverAddress = null;
  70. // Log.d('🛑 WebSocket 服务器已停止');
  71. }
  72. void _updateStatus(WebsocketServerStatus status) {
  73. _status = status;
  74. String statusStr = '';
  75. switch (status) {
  76. case WebsocketServerStatus.starting:
  77. statusStr = '正在启动...';
  78. break;
  79. case WebsocketServerStatus.started:
  80. statusStr = '🚀 服务器已启动,监听端口: $_serverAddress';
  81. break;
  82. case WebsocketServerStatus.stopping:
  83. statusStr = '正在关闭...';
  84. break;
  85. case WebsocketServerStatus.stopped:
  86. statusStr = '🛑 服务器已关闭';
  87. break;
  88. }
  89. _eventController.add(statusStr);
  90. }
  91. }