新增websocket客户端

This commit is contained in:
2025-01-16 16:23:02 +08:00
parent 0fee2d7f69
commit 223ed5b215
3 changed files with 96 additions and 8 deletions

View File

@@ -12,7 +12,9 @@ import 'package:EasyDartModule/base/redis/redis.dart';
import 'package:EasyDartModule/base/storage/Storage.dart'; import 'package:EasyDartModule/base/storage/Storage.dart';
import 'package:EasyDartModule/base/storage/impl/MinIoStorage.dart'; import 'package:EasyDartModule/base/storage/impl/MinIoStorage.dart';
import 'package:EasyDartModule/base/webserver/WebServer.dart'; import 'package:EasyDartModule/base/webserver/WebServer.dart';
import 'package:EasyDartModule/base/webserver/impl/ShelfWebServer.dart' if (dart.library.html) 'package:EasyDartModule/base/webserver/impl/ShelfWebServer_none.dart'; import 'package:EasyDartModule/base/webserver/impl/ShelfWebServer.dart'
if (dart.library.html) 'package:EasyDartModule/base/webserver/impl/ShelfWebServer_none.dart';
import 'package:EasyDartModule/base/websocket/WebSocket.dart';
export 'package:shelf/shelf.dart'; export 'package:shelf/shelf.dart';
export 'package:mongo_dart/mongo_dart.dart'; export 'package:mongo_dart/mongo_dart.dart';
@@ -26,14 +28,17 @@ class EasyDartModule {
static Mqtt get mqtt => Mqtt.getInstance(); static Mqtt get mqtt => Mqtt.getInstance();
static Storage get storage => Storage.getInstance(); static Storage get storage => Storage.getInstance();
static Redis get redis => Redis.getInstance(); static Redis get redis => Redis.getInstance();
static WebSocket get websocket => WebSocket.getInstance();
static bool init( static bool init({
{DiscoveryConfig? discoveryConfig, DiscoveryConfig? discoveryConfig,
DataBaseConfig? dataBaseConfig, DataBaseConfig? dataBaseConfig,
LoggerConfig? loggerConfig, LoggerConfig? loggerConfig,
MqttConfig? mqttConfig, MqttConfig? mqttConfig,
StorageConfig? storageConfig, StorageConfig? storageConfig,
RedisConfig? redisConfig}) { RedisConfig? redisConfig,
WebSocketConfig? webSocketConfig,
}) {
if (discoveryConfig != null) { if (discoveryConfig != null) {
//nacos注册配置中心 //nacos注册配置中心
Discovery.setInstance(NacosDiscovery(discoveryConfig)); Discovery.setInstance(NacosDiscovery(discoveryConfig));
@@ -63,6 +68,10 @@ class EasyDartModule {
//Dio组件 //Dio组件
TraceDio.setInstance(TraceDio(logger)); TraceDio.setInstance(TraceDio(logger));
} }
if (webSocketConfig != null) {
WebSocket.setInstance(WebSocket(webSocketConfig));
websocket.connect();
}
return true; return true;
} }
} }

View File

@@ -0,0 +1,78 @@
import 'dart:async';
import 'dart:convert';
import 'package:web_socket_channel/web_socket_channel.dart';
class WebSocket {
static late WebSocket _webSocket;
WebSocketConfig _config;
WebSocketChannel? _channel;
bool _reConnect = true;
static WebSocket getInstance() {
return _webSocket;
}
static void setInstance(WebSocket webSocket) {
_webSocket = webSocket;
}
WebSocket(this._config);
void reConnect() {
//判断是否启用自动重连
if (_config.reConnect && _reConnect) {
//2秒后重连
Future.delayed(Duration(seconds: 2), () {
connect();
});
}
}
Future<void> connect() async {
final wsUrl = Uri.parse(_config.host);
final channel = WebSocketChannel.connect(wsUrl);
try {
await channel.ready;
} catch (e) {
print(e);
//连接失败
reConnect();
return;
}
_channel = channel;
_reConnect = _config.reConnect;
Timer? _timer;
channel.stream.listen((message) {
// channel.sink.add('received!');
// channel.sink.close(goingAway);
_config.messgae(message);
}, onDone: () {
_timer?.cancel();
_timer = null;
//尝试重连
_channel = null;
reConnect();
});
//定期发送心跳包
_timer = Timer.periodic(Duration(seconds: 30), (t) {
sendData(jsonEncode({"ht": "ht"}));
});
}
void close() {
_reConnect = false;
_channel?.sink.close();
}
void sendData(String data) {
_channel?.sink.add(data);
}
}
class WebSocketConfig {
String host;
bool reConnect;
void Function(String) messgae;
WebSocketConfig(this.host, this.messgae, {this.reConnect = true});
}

View File

@@ -20,6 +20,7 @@ dependencies:
minio: ^3.5.7 minio: ^3.5.7
redis: ^4.0.0 redis: ^4.0.0
dart_jsonwebtoken: ^2.14.2 dart_jsonwebtoken: ^2.14.2
web_socket_channel: ^3.0.1
dev_dependencies: dev_dependencies:
lints: ^4.0.0 lints: ^4.0.0