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 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}); }