发送点击消息
This commit is contained in:
parent
6474edc27e
commit
625579e510
|
|
@ -0,0 +1,32 @@
|
|||
// 定义密钥
|
||||
List skey = [8, 1, 2, 5, 4];
|
||||
|
||||
// 单个字符异或运算
|
||||
String makecodeChar(String c, int key, int key2) {
|
||||
int charCode = c.codeUnitAt(0);
|
||||
charCode = (((charCode + key) ^ key2) ^ key) + 1;
|
||||
return String.fromCharCode(charCode);
|
||||
}
|
||||
|
||||
// 单个字符解密
|
||||
String cutcodeChar(String c, int key, int key2) {
|
||||
int charCode = c.codeUnitAt(0);
|
||||
charCode = (((charCode - 1) ^ key) ^ key2) - key;
|
||||
return String.fromCharCode(charCode);
|
||||
}
|
||||
|
||||
// 加密
|
||||
String makecode(String pstr, List pkey) {
|
||||
String pp = pstr;
|
||||
for (int i = 0; i < pp.length; i++) {
|
||||
pp = pp.replaceRange(i, i + 1, makecodeChar(pp[i], pkey[i % 5], pkey[(i + 18) % 5]));
|
||||
}
|
||||
return pp;
|
||||
}
|
||||
|
||||
// 解密
|
||||
void cutecode(String pstr, List pkey) {
|
||||
for (int i = 0; i < pstr.length; i++) {
|
||||
pstr = pstr.replaceRange(i, i + 1, cutcodeChar(pstr[i], pkey[i % 5], pkey[(i + 18) % 5]));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
|
||||
|
||||
import 'dart:convert';
|
||||
import 'dart:typed_data';
|
||||
|
||||
/// 添加小端序头
|
||||
extension MapLittle on Map {
|
||||
|
||||
/// 在转成 Uint8List 的数据前面添加 小端序
|
||||
Uint8List toLittle({dynamic value = 0, int length = 4}){
|
||||
|
||||
/// map 转 json
|
||||
String mapJson = jsonEncode(this);
|
||||
/// json 转 Uint8List
|
||||
final mapData = utf8.encode(mapJson);
|
||||
|
||||
/// 添加小端序
|
||||
final data = mapData.toLittle(value: value,length: length);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
extension Uint8ListLittle on Uint8List {
|
||||
|
||||
/// 在转成 Uint8List 的数据前面添加 小端序
|
||||
Uint8List toLittle({dynamic value = 0, int length = 4}){
|
||||
|
||||
var mapData = this;
|
||||
|
||||
/// 初始化 定义数据长度
|
||||
final little = ByteData(length);
|
||||
/// 设置小端序数据
|
||||
little.setInt32(0, value,Endian.little);
|
||||
/// 小端序 转 Uint8List
|
||||
var littleData = little.buffer.asUint8List();
|
||||
|
||||
/// 初始化 Uint8List
|
||||
Uint8List data = Uint8List(littleData.length + mapData.length );
|
||||
|
||||
/// 组装 map Uint8List 和 小端序 Uint8List
|
||||
data.setRange(0, littleData.length, littleData);
|
||||
data.setRange(littleData.length, mapData.length + littleData.length, mapData);
|
||||
|
||||
/// 返回组合数据
|
||||
return data;
|
||||
}
|
||||
|
||||
// Uint8List转int 从前4位转小端序
|
||||
int? fromLittle({int start = 0,int length = 4}) {
|
||||
if (this.length < length){
|
||||
print('转小端序的数据长度不足');
|
||||
return null;
|
||||
}
|
||||
|
||||
final littleData = sublist(start,start + length);
|
||||
// 创建ByteData
|
||||
ByteData byteData = littleData.buffer.asByteData();
|
||||
|
||||
// 读取小端序的32位整数
|
||||
int little = byteData.getInt32(0, Endian.little);
|
||||
|
||||
return little;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
import 'dart:math';
|
||||
|
||||
class NumberTool {
|
||||
|
||||
/// 生成随机数
|
||||
/// @allNum: 随机数的和
|
||||
/// @num: 随机数的数量
|
||||
List<int> randomNum(int allNum, {int num = 10}) {
|
||||
List<int> randomNumbers = [];
|
||||
int remainingNum = allNum;
|
||||
|
||||
for (int i = 0; i < num - 1; i++) {
|
||||
int randomNumber = Random().nextInt(remainingNum) + 1;
|
||||
randomNumbers.add(randomNumber);
|
||||
remainingNum -= randomNumber;
|
||||
}
|
||||
|
||||
randomNumbers.add(allNum - randomNumbers.fold(0, (prev, element) => prev + element));
|
||||
|
||||
return randomNumbers;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,22 +1,77 @@
|
|||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'dart:typed_data';
|
||||
import 'little_extension.dart';
|
||||
import 'code.dart';
|
||||
|
||||
class SocketTool {
|
||||
connect() {
|
||||
Socket.connect('127.0.0.1', 12345).then((socket) {
|
||||
print(
|
||||
'Connected to: ${socket.remoteAddress.address}:${socket.remotePort}');
|
||||
class SocketUtils extends Socket{
|
||||
// 私有构造函数
|
||||
SocketUtils._();
|
||||
// 私有静态变量,保存类的唯一实例
|
||||
static SocketUtils? _instance;
|
||||
|
||||
socket.write('GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n');
|
||||
// 公开的静态方法,返回类的唯一实例
|
||||
static SocketUtils getInstance() {
|
||||
_instance ??= SocketUtils._();
|
||||
return _instance!;
|
||||
}
|
||||
|
||||
socket.listen((data) {
|
||||
print(String.fromCharCodes(data).trim());
|
||||
print('消息');
|
||||
}, onDone: () {
|
||||
print('Connection closed');
|
||||
socket.destroy();
|
||||
});
|
||||
}).catchError((error) {
|
||||
print('Error: $error');
|
||||
}
|
||||
|
||||
class Socket {
|
||||
|
||||
static String url = '127.0.0.1';
|
||||
static int port = 12345;
|
||||
|
||||
RawDatagramSocket? socket;
|
||||
|
||||
connect() async {
|
||||
socket = await RawDatagramSocket.bind('127.0.0.2', 1);
|
||||
print('UDP Socket bound to ${socket?.address.address}:${socket?.port}');
|
||||
|
||||
// 监听来自网络的数据包
|
||||
socket?.listen((RawSocketEvent e) {
|
||||
Datagram? d = socket?.receive();
|
||||
if (d == null) return;
|
||||
|
||||
// String message = String.fromCharCodes(d.data).trim();
|
||||
// print('Datagram from ${d.address.address}:${d.port}: $message');
|
||||
});
|
||||
|
||||
heartbeat();
|
||||
}
|
||||
|
||||
/// 发送消息
|
||||
sendMessage(Map data){
|
||||
socket?.send(dataMake(data), InternetAddress(url), port);
|
||||
}
|
||||
|
||||
|
||||
/// 心跳
|
||||
heartbeat(){
|
||||
Timer timer = Timer(const Duration(seconds: 10), () {
|
||||
Map data = {
|
||||
"op": 1,
|
||||
"IC": 0
|
||||
};
|
||||
socket?.send(dataMake(data), InternetAddress(url), port);
|
||||
|
||||
heartbeat();
|
||||
});
|
||||
}
|
||||
|
||||
/// 发送数据的处理
|
||||
List<int> dataMake(Map map){
|
||||
// 将Map对象转换为JSON字符串
|
||||
String json = jsonEncode(map);
|
||||
// 加密
|
||||
String ps = makecode(json, skey);
|
||||
// 转成无符号整数数组
|
||||
Uint8List uinData = Uint8List.fromList(ps.codeUnits);
|
||||
// 在前面添加 4位 表示长度的小端序
|
||||
uinData = uinData.toLittle(value: uinData.length);
|
||||
return uinData.toList();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
|
||||
import 'dart:ffi';
|
||||
|
||||
import 'package:web_synchronization_tool/windows/socket_tool.dart';
|
||||
import 'package:web_synchronization_tool/windows/windowsJs.dart';
|
||||
import 'package:webview_windows/webview_windows.dart';
|
||||
|
||||
|
|
@ -53,6 +54,7 @@ class SynchronizationWebTool{
|
|||
double y = (click['y'] as int).toDouble();
|
||||
|
||||
clickSynchronization(x, y);
|
||||
SocketUtils.getInstance().sendMessage(event);
|
||||
}
|
||||
|
||||
if (event['scroll'] != null ) {
|
||||
|
|
@ -76,6 +78,7 @@ class SynchronizationWebTool{
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/// 滚动同步
|
||||
scrollSynchronization(int y){
|
||||
for (var controller in childController) {
|
||||
|
|
@ -84,10 +87,10 @@ class SynchronizationWebTool{
|
|||
}
|
||||
|
||||
/// 输入
|
||||
input(int value){
|
||||
mainController.executeScript(WindowsJs.inputJs(value));
|
||||
for (var controller in childController) {
|
||||
controller.executeScript(WindowsJs.inputJs(value));
|
||||
input(List<int> values){
|
||||
for (int i =0;i<childController.length;i++){
|
||||
WebviewController controller = childController[i];
|
||||
controller.executeScript(WindowsJs.inputJs(values[i]));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:web_synchronization_tool/windows/show_animation_utils.dart';
|
||||
import 'package:web_synchronization_tool/windows/number_tool.dart';
|
||||
import 'package:web_synchronization_tool/windows/synchronization_web_tool.dart';
|
||||
import 'package:web_synchronization_tool/windows/windowsJs.dart';
|
||||
import 'package:webview_windows/webview_windows.dart';
|
||||
|
|
@ -116,6 +116,7 @@ class ShowWebWidget extends StatefulWidget {
|
|||
class _ShowWebWidgetState extends State<ShowWebWidget> {
|
||||
|
||||
TextEditingController textController = TextEditingController();
|
||||
TextEditingController numController = TextEditingController();
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
|
|
@ -151,18 +152,29 @@ class _ShowWebWidgetState extends State<ShowWebWidget> {
|
|||
widget.controller.openDevTools();
|
||||
},
|
||||
child: const Text('开发者')),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
widget.controller.executeScript(WindowsJs.inputJs(45));
|
||||
// controller.executeScript(WindowsJs.inputJs(45));
|
||||
},
|
||||
child: const Text('模拟输入测试')),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
widget.controller.loadUrl('https://www.baidu.com/');
|
||||
},
|
||||
child: const Text('跳转首页')),
|
||||
Row(
|
||||
children: [
|
||||
SizedBox(width: 100, child: TextField(style: const TextStyle(fontSize: 14),controller: numController,)),
|
||||
TextButton(
|
||||
onPressed: () {
|
||||
try{
|
||||
int num = int.parse(numController.text);
|
||||
if (num <= 10){
|
||||
numController.text = '金额不能小于10';
|
||||
return;
|
||||
}
|
||||
|
||||
List<int> nums = NumberTool().randomNum(num,num: SynchronizationWebTool.getInstance().childController.length);
|
||||
widget.controller.executeScript(WindowsJs.inputJs(nums.first));
|
||||
nums.removeAt(0);
|
||||
SynchronizationWebTool.getInstance().input(nums);
|
||||
}catch(e){
|
||||
numController.text = '请输入数字';
|
||||
}
|
||||
},
|
||||
child: const Text('填入总金额')),
|
||||
],
|
||||
),
|
||||
Row(
|
||||
children: [
|
||||
const Text('同步'),
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:web_synchronization_tool/windows/socket_tool.dart';
|
||||
import 'package:web_synchronization_tool/windows/web_grid_view.dart';
|
||||
import 'package:webview_windows/webview_windows.dart';
|
||||
|
||||
|
|
@ -41,7 +42,7 @@ class _WindowsPageState extends State<WindowsPage> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
|
||||
// SocketTool().connect();
|
||||
SocketUtils.getInstance().connect();
|
||||
|
||||
if (initDone == false) return Container();
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue