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

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数据,当然也能正常工作,不过实验证明是不需要的了。

相关推荐
ii_best29 分钟前
按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
android
美狐美颜sdk36 分钟前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
Hacker_Oldv2 小时前
软件测试(功能、工具、接口、性能、自动化、测开)详解
运维·自动化
Java樱木2 小时前
使用字节Trae + MCP,UI 到网页自动化。
运维·自动化
某公司摸鱼前端2 小时前
uniapp socket 封装 (可拿去直接用)
前端·javascript·websocket·uni-app
要加油哦~2 小时前
vue | 插件 | 移动文件的插件 —— move-file-cli 插件 的安装与使用
前端·javascript·vue.js
GDAL3 小时前
Node.js v22.5+ 官方 SQLite 模块全解析:从入门到实战
数据库·sqlite·node.js
2501_915921434 小时前
iOS IPA 混淆实测分析:从逆向视角验证加固效果与防护流程
websocket·网络协议·tcp/ip·http·网络安全·https·udp
2501_915918414 小时前
打造可观测的 iOS CICD 流程:调试、追踪与质量保障全记录
websocket·网络协议·tcp/ip·http·网络安全·https·udp
wen's4 小时前
React Native 0.79.4 中 [RCTView setColor:] 崩溃问题完整解决方案
javascript·react native·react.js