2024-04-05 18:09:40 +08:00
|
|
|
|
|
|
|
|
import 'dart:async';
|
|
|
|
|
import 'dart:convert';
|
2024-04-06 15:38:28 +08:00
|
|
|
import 'dart:ffi';
|
2024-04-05 18:09:40 +08:00
|
|
|
import 'dart:io';
|
2024-04-06 15:38:28 +08:00
|
|
|
import 'dart:typed_data';
|
2024-04-05 18:09:40 +08:00
|
|
|
|
|
|
|
|
import 'package:common/utils/toast_utils.dart';
|
2024-04-06 15:38:28 +08:00
|
|
|
import 'package:web_synchronization_tool/windows/little_extension.dart';
|
2024-04-05 18:09:40 +08:00
|
|
|
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{
|
|
|
|
|
|
2024-04-06 16:16:15 +08:00
|
|
|
String url = '110.42.251.214';
|
2024-04-05 18:09:40 +08:00
|
|
|
static int port = 37785;
|
|
|
|
|
|
|
|
|
|
String uuid = '';
|
|
|
|
|
|
2024-04-06 15:38:28 +08:00
|
|
|
Socket? socket;
|
2024-04-05 18:09:40 +08:00
|
|
|
|
|
|
|
|
int heartTime = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
connect() async {
|
2024-04-06 17:00:54 +08:00
|
|
|
socket?.close();
|
2024-04-06 15:38:28 +08:00
|
|
|
socket = await Socket.connect(url, port, timeout: const Duration(seconds: 30));
|
2024-04-06 17:00:54 +08:00
|
|
|
heartTime = DateTime.now().millisecondsSinceEpoch;
|
2024-04-06 15:38:28 +08:00
|
|
|
|
|
|
|
|
socket?.listen((event) {
|
|
|
|
|
|
|
|
|
|
Map data = dataCute(event);
|
|
|
|
|
|
2024-04-05 18:09:40 +08:00
|
|
|
// 登录结果
|
|
|
|
|
if (data['op'] == 2){
|
|
|
|
|
loginBlock(data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 服务器心跳
|
|
|
|
|
if (data['op'] == 4){
|
|
|
|
|
try{
|
2024-04-06 17:00:54 +08:00
|
|
|
|
|
|
|
|
// 更新上次心跳时间
|
|
|
|
|
heartTime = DateTime.now().millisecondsSinceEpoch;
|
|
|
|
|
|
|
|
|
|
// 心跳回报时间是否超时
|
2024-04-06 15:38:28 +08:00
|
|
|
int time = data['time'];
|
|
|
|
|
time = DateTime.now().millisecondsSinceEpoch - time;
|
|
|
|
|
if(time> (3 * 60 * 1000) ){ // 时间戳 > 3分钟
|
2024-04-05 18:09:40 +08:00
|
|
|
socketError();
|
|
|
|
|
}
|
|
|
|
|
}catch(e){
|
|
|
|
|
socketError();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-06 15:38:28 +08:00
|
|
|
},onDone: (){
|
|
|
|
|
},onError: (error){
|
|
|
|
|
// 连接断开
|
|
|
|
|
socketError();
|
|
|
|
|
socket?.destroy();
|
2024-04-05 18:09:40 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-06 15:38:28 +08:00
|
|
|
|
2024-04-05 18:09:40 +08:00
|
|
|
socketError(){
|
|
|
|
|
/// 任何错误都显示这个
|
|
|
|
|
ToastUtils.showLoading(msg: '重连中');
|
|
|
|
|
/// 关闭同步 socket
|
|
|
|
|
SocketUtils.getInstance().socket?.close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
late loginBlockFun loginBlock;
|
|
|
|
|
|
2024-04-06 15:38:28 +08:00
|
|
|
// 登录
|
2024-04-05 18:09:40 +08:00
|
|
|
login(String account,String passwoord,loginBlockFun blockFun){
|
|
|
|
|
|
|
|
|
|
loginBlock = blockFun;
|
|
|
|
|
|
|
|
|
|
Map map = {
|
2024-04-06 15:38:28 +08:00
|
|
|
'op':1,
|
2024-04-05 18:09:40 +08:00
|
|
|
'account':account,
|
2024-04-06 15:38:28 +08:00
|
|
|
'password':passwoord,
|
|
|
|
|
'uuid':uuid
|
2024-04-05 18:09:40 +08:00
|
|
|
};
|
2024-04-06 15:38:28 +08:00
|
|
|
|
|
|
|
|
final dd = dataMake(map);
|
|
|
|
|
socket?.add(dd);
|
|
|
|
|
socket?.flush();
|
2024-04-05 18:09:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// 心跳
|
|
|
|
|
heartbeat(){
|
|
|
|
|
|
2024-04-06 15:38:28 +08:00
|
|
|
Timer(const Duration(seconds: 20), () async {
|
2024-04-05 18:09:40 +08:00
|
|
|
|
2024-04-06 17:00:54 +08:00
|
|
|
final time = DateTime.now().millisecondsSinceEpoch - heartTime;
|
|
|
|
|
if(time > (3 * 60 * 1000) ){ // 时间戳 > 3分钟
|
|
|
|
|
socketError();
|
|
|
|
|
return;
|
2024-04-05 18:09:40 +08:00
|
|
|
}
|
|
|
|
|
|
2024-04-06 17:00:54 +08:00
|
|
|
heartbeat();
|
|
|
|
|
|
2024-04-05 18:09:40 +08:00
|
|
|
Map map = {
|
|
|
|
|
"op": 3,
|
|
|
|
|
};
|
2024-04-06 15:38:28 +08:00
|
|
|
|
|
|
|
|
socket?.add(dataMake(map));
|
|
|
|
|
socket?.flush();
|
2024-04-05 18:09:40 +08:00
|
|
|
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-06 15:38:28 +08:00
|
|
|
|
|
|
|
|
/// 发送数据的处理
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-05 18:09:40 +08:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|