import 'dart:async'; import 'dart:convert'; import 'dart:ffi'; import 'dart:io'; import 'dart:typed_data'; import 'package:common/utils/toast_utils.dart'; import 'package:web_synchronization_tool/windows/little_extension.dart'; import 'package:web_synchronization_tool/windows/socket_tool.dart'; import '../windows/code.dart'; class LoginSocketUtils extends LoginSocket { // 私有构造函数 LoginSocketUtils._(); // 私有静态变量,保存类的唯一实例 static LoginSocketUtils? _instance; // 公开的静态方法,返回类的唯一实例 static LoginSocketUtils getInstance() { _instance ??= LoginSocketUtils._(); return _instance!; } } typedef loginBlockFun = Function(Map); class LoginSocket{ String url = '192.168.200.17'; // static int port = 12341; static int port = 37785; String uuid = ''; Socket? socket; int heartTime = 0; connect() async { socket = await Socket.connect(url, port, timeout: const Duration(seconds: 30)); socket?.listen((event) { Map data = dataCute(event); // 登录结果 if (data['op'] == 2){ loginBlock(data); } // 服务器心跳 if (data['op'] == 4){ try{ int time = data['time']; time = DateTime.now().millisecondsSinceEpoch - time; if(time> (3 * 60 * 1000) ){ // 时间戳 > 3分钟 socketError(); } }catch(e){ socketError(); } } },onDone: (){ },onError: (error){ // 连接断开 socketError(); socket?.destroy(); }); } socketError(){ /// 任何错误都显示这个 ToastUtils.showLoading(msg: '重连中'); /// 关闭同步 socket SocketUtils.getInstance().socket?.close(); } late loginBlockFun loginBlock; // 登录 login(String account,String passwoord,loginBlockFun blockFun){ loginBlock = blockFun; Map map = { 'op':1, 'account':account, 'password':passwoord, 'uuid':uuid }; final dd = dataMake(map); socket?.add(dd); socket?.flush(); } /// 心跳 heartbeat(){ DateTime now = DateTime.now(); int timestamp = now.millisecondsSinceEpoch; // 秒 heartTime = timestamp; Timer(const Duration(seconds: 20), () async { if (socket == null){ // 重连 await connect(); } Map map = { "op": 3, }; socket?.add(dataMake(map)); socket?.flush(); heartbeat(); }); } /// 发送数据的处理 List dataMake(Map map){ // 将Map对象转换为JSON字符串 String json = jsonEncode(map); // 加密 String ps = makecode(json, skey); List bytes = ps.codeUnits; // 将字符串转换为字节数组 return bytes.toLittle(); } /// 接收数据处理 Map dataCute(Uint8List data){ if (data.length <= 4) return {}; Uint8List pData = data.sublist(4,data.length); String str = cutecode(pData); Map map = json.decode(str); return map; } }