AutoX.js向后端传输二进制数据

news/2024/9/24 18:32:54/

android的JavaScript自动化软件用过Hamibot和AutoX.js 不过在向后端传输二进制数据时都有些限制,不如浏览器前端那么自由。Hamibot的http按文档应该时能支持传字节数组,但是实际上应该还没有支持。AutoX.js的http也是这样,但是AutoX.js还支持Websocket,它的websocket模块,采用okhttp3 实现,模块中包含了okhttp3 核心所有的类,而okhttp3支持发送String和ByteString,而后者则是我心心念念的二进制数据传输功能。
为什么我纠结于直接传输二进制数据,直接传文件或者将数据base64编码传到后端不简单么?其实主要是效率考虑,比如我使用截图,在内存中可以得到image的字节数组,如果传文件,还得把image写入本地硬盘,然后发送出去,又得读一遍本地硬盘,不是浪费了这两次IO么?当然系统会带IO缓存,耗时不一定会大。而转base64则编码效率比二进制至少低1/4(相当于8bit的数据只能编码成6bit的数据),所以,我还是希望能支持直接把二进制数据传到后端为好。
兴奋之余遇到一个问题,ByteString是okhttp3的websocket发送支持的数据类型,不是AutoX.js默认支持的数据类型,要把image的字节数组转成ByteString得依赖于okio这个外部库里的ByteString这个类的方法。

javascript">var img = captureScreen();
var clip=images.clip(img, 400, 400, 400, 400);
var ba=images.toBytes(clip,format = "png", quality = 100)
clip.recycle();importPackage(Packages["okhttp3"]); //导入包
let ByteString = Packages.okio.ByteString;var client = new OkHttpClient.Builder().retryOnConnectionFailure(true).build();
var request = new Request.Builder().url("ws://192.168.137.1:8080").build(); 
client.dispatcher().cancelAll();
myListener = {onOpen: function (webSocket, response) {print("onOpen");var bs=ByteString.of(ba);webSocket.send(bs);},onMessage: function (webSocket, msg) { print("msg");print(msg);},onClosing: function (webSocket, code, response) {print("正在关闭");},onClosed: function (webSocket, code, response) {print("已关闭");},onFailure: function (webSocket, t, response) {print("错误");print( t);}
}var webSocket= client.newWebSocket(request, new WebSocketListener(myListener)); 
setInterval(() => { // 防止主线程退出   
}, 1000);

websocket服务端是这样的:

javascript">const WebSocket = require('ws');
const fs=require('fs')const wss = new WebSocket.Server({ port: 8080 });wss.on('connection', function connection(ws) {ws.on('message', function incoming(message) {console.log("收到消息:");console.log(message.length)fs.writeFile('fromautox.png', message, 'utf8', err => {if (err) console.log('file system', err);else console.log('done');
});});ws.send('something');
});

这样就完成了前端抓图直接传到后端保存图片的流程
此前还担心ByteString这种数据类型需要okhttp的websocketlistener来解析处理,由于okhttp只有websocket客户端,还不支持websocket服务器,所以还需要一个websocket服务器来转发请求到另一个websocket客户端来用websocketlistener来处理收到的ByteString数据,当然也能正常工作,不过实验证明是不需要的了。


http://www.ppmy.cn/news/1529924.html

相关文章

路由器全局配置DHCP实验简述

一、路由器配置 reset saved-configuration Warning: The action will delete the saved configuration in the device. The configuration will be erased to reconfigure. Continue? [Y/N]:y Warning: Now clearing the configuration in the device. Info: Succeeded in c…

微服务开发

微服务的架构使得小改动频繁上线和下线非常容易,可以直接在运行的产品上推送一个新的功能或者下线一个无用的功能:获得持续交付的能力。 SOA 的起源 SOA(Service-Oriented Architecture):将应用组织成一个独立的功能…

【字符函数】strcpy函数(字符串复制函数)+strcat函数(字符串追加)+strcmp函数(字符串比较)【笔记】

1.复制函数--------------strcpy函数 函数使用 char*strcpy(char* destination, const char* source) strcpy函数用于拷贝字符串,即将一个字符串中的内容拷贝到另一个字符串中(会覆盖原字符串内容)。它的参数是两个指…

基于单片机的车载传感器数据处理系统

1总体方案设计 本次新能源汽车车载传感器数据处理系统,其系统总体架构如图2.1所示,采用STM32f103单片机作为控制器,通过DH11传感器实现温湿度检测;通过光敏电阻实现光照检测;同时其检测的信息通过ESP8266 WiFi模块传输…

如何选择适合的编程工具提高工作效率

---  随着科技的发展,编程已经成为各行各业不可或缺的一部分。在忙碌的工作环境中,如何选择合适的编程工具成为了每个开发者提升工作效率的关键。智能的代码编辑器、强大的版本控制工具、还是那些让你事半功倍的自动化脚本?让我们一起探讨&…

【Docker】Docker上安装MySql8和Redis

MySql安装 对于镜像中需要持久化保存的⽂件,需要通过-v挂载到宿主机上,这样这些⽂件才不会随着容器关闭⽽消失。 对于MySQL,需要将他的⽇志⽂件、数据⽂件和配置⽂件挂载到宿主机上。 # 拉取镜像 docker pull mysql:8 # 启动mysql并配置⼯作…

如何从GitHub上Clone项目

GitHub 是全球最大的开源代码托管平台之一,开发者可以在上面分享代码,协作开发,提交贡献。对于程序员来说,从 GitHub 上获取代码并在本地运行和修改是非常重要的一个技能。本文将深入介绍如何从 GitHub 上 clone 项目,…

Rustrover2024.2 正式发布:个人非商用免费,泰裤辣

如果这个世界本身 已经足够荒唐 那究竟什么才能算是疯狂 爱情就是这样 一旦错过了 就会有另一个人代替 我们知道 jetbrains 在今年的早些时候正式为 rust 语言发布了专用的 IDE ,也就是 rustrover。如今 rustrover 也正式跻身为 jetbrains IDE 系列的一员猛将。…