web_synchronization_tool/lib/login/login_socket_utils.dart

169 lines
3.2 KiB
Dart

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 = '110.42.251.214';
static int port = 37785;
String uuid = '';
Socket? socket;
int heartTime = 0;
connect() async {
socket?.close();
socket = await Socket.connect(url, port, timeout: const Duration(seconds: 30));
heartTime = DateTime.now().millisecondsSinceEpoch;
socket?.listen((event) {
Map data = dataCute(event);
// 登录结果
if (data['op'] == 2){
loginBlock(data);
}
// 服务器心跳
if (data['op'] == 4){
try{
// 更新上次心跳时间
heartTime = DateTime.now().millisecondsSinceEpoch;
// 心跳回报时间是否超时
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(){
Timer(const Duration(seconds: 20), () async {
final time = DateTime.now().millisecondsSinceEpoch - heartTime;
if(time > (3 * 60 * 1000) ){ // 时间戳 > 3分钟
socketError();
return;
}
heartbeat();
Map map = {
"op": 3,
};
socket?.add(dataMake(map));
socket?.flush();
});
}
/// 发送数据的处理
List<int> dataMake(Map map){
// 将Map对象转换为JSON字符串
String json = jsonEncode(map);
// 加密
String ps = makecode(json, skey);
List<int> 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;
}
}