教学网站开发应用方案,企业所得税会计分录,WordPress同步自媒体,phpcms套好的网站 放到空间上 后台打开的验证码不能显示android的JavaScript自动化软件用过Hamibot和AutoX.js 不过在向后端传输二进制数据时都有些限制#xff0c;不如浏览器前端那么自由。Hamibot的http按文档应该时能支持传字节数组#xff0c;但是实际上应该还没有支持。AutoX.js的http也是这样#xff0c;但是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这个类的方法。
var img captureScreen();
var clipimages.clip(img, 400, 400, 400, 400);
var baimages.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 bsByteString.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服务端是这样的
const WebSocket require(ws);
const fsrequire(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数据当然也能正常工作不过实验证明是不需要的了。