84 lines
2.4 KiB
Dart
84 lines
2.4 KiB
Dart
import 'dart:typed_data';
|
|
import 'dart:html' as html;
|
|
|
|
import 'package:wukongimfluttersdk/common/logs.dart';
|
|
import 'package:wukongimfluttersdk/manager/my_wk_socket_base.dart';
|
|
|
|
class MyH5WKSocket implements MyWkSocketBase {
|
|
html.WebSocket? _socket; // 将 _socket 声明为可空类型
|
|
bool _isListening = false;
|
|
|
|
static MyH5WKSocket? _instance;
|
|
MyH5WKSocket._internal(this._socket);
|
|
|
|
factory MyH5WKSocket.newSocket(String url) {
|
|
var socket = html.WebSocket(url);
|
|
_instance ??= MyH5WKSocket._internal(socket);
|
|
return _instance!;
|
|
}
|
|
|
|
@override
|
|
void close() {
|
|
_isListening = false;
|
|
_instance = null;
|
|
try {
|
|
_socket?.close();
|
|
} finally {
|
|
_socket = null; // 现在可以将 _socket 设置为 null
|
|
}
|
|
}
|
|
|
|
@override
|
|
void listen(
|
|
{required Function(Uint8List data) onData,
|
|
required Function() onOpen,
|
|
required Function() error}) {
|
|
if (!_isListening && _socket != null) {
|
|
_socket!.onMessage.listen((message) {
|
|
if (message.data is html.Blob) {
|
|
html.Blob blobData = message.data as html.Blob;
|
|
// 使用 FileReader 来读取 Blob
|
|
html.FileReader reader = html.FileReader();
|
|
reader.readAsArrayBuffer(blobData);
|
|
// 监听读取完成事件
|
|
reader.onLoadEnd.listen((event) {
|
|
// 获取 ArrayBuffer 数据
|
|
Uint8List uint8List = reader.result as Uint8List;
|
|
onData(uint8List);
|
|
// 你可以继续使用 uint8List 进行其他操作
|
|
});
|
|
} else {
|
|
// 处理非 Blob 类型数据
|
|
Logs.debug("---> Received non-Blob message: ${message.data}");
|
|
}
|
|
});
|
|
_socket!.onOpen.listen((data) {
|
|
Logs.debug("---> $data,状态: ${_socket?.readyState}");
|
|
onOpen();
|
|
});
|
|
_socket!.onError.listen((data) {
|
|
Logs.debug('socket断开了 : ${data.toString()}');
|
|
});
|
|
_socket!.onClose.listen((data) {
|
|
Logs.debug(
|
|
'socket close 关闭了 : ${data.toString()} ,状态: ${_socket?.readyState}',
|
|
);
|
|
close(); // 关闭和重置 Socket 连接
|
|
error();
|
|
});
|
|
_isListening = true;
|
|
}
|
|
}
|
|
|
|
@override
|
|
send(Uint8List data) {
|
|
try {
|
|
if (_socket != null) {
|
|
_socket?.send(data); // 使用安全调用操作符
|
|
}
|
|
} catch (e) {
|
|
Logs.debug('发送消息错误$e');
|
|
}
|
|
}
|
|
}
|