79 lines
1.7 KiB
Dart
79 lines
1.7 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;
|
|
} 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});
|
|
}
|