Files
easy_dart_module/lib/base/websocket/WebSocket.dart
2025-02-21 19:24:59 +08:00

86 lines
1.8 KiB
Dart

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;
Future.delayed(Duration(seconds: 2), () {
if (_config.onOpen != null) {
_config.onOpen!();
}
});
} 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;
void Function()? onOpen;
WebSocketConfig(this.host, this.messgae,
{this.reConnect = true, this.onOpen});
}