如何推廣一個新的app優(yōu)化網(wǎng)站排名費(fèi)用
android的JavaScript自動化軟件用過Hamibot和AutoX.js 不過在向后端傳輸二進(jìn)制數(shù)據(jù)時都有些限制,不如瀏覽器前端那么自由。Hamibot的http按文檔應(yīng)該時能支持傳字節(jié)數(shù)組,但是實際上應(yīng)該還沒有支持。AutoX.js的http也是這樣,但是AutoX.js還支持Websocket,它的websocket模塊,采用okhttp3 實現(xiàn),模塊中包含了okhttp3 核心所有的類,而okhttp3支持發(fā)送String和ByteString,而后者則是我心心念念的二進(jìn)制數(shù)據(jù)傳輸功能。
為什么我糾結(jié)于直接傳輸二進(jìn)制數(shù)據(jù),直接傳文件或者將數(shù)據(jù)base64編碼傳到后端不簡單么?其實主要是效率考慮,比如我使用截圖,在內(nèi)存中可以得到image的字節(jié)數(shù)組,如果傳文件,還得把image寫入本地硬盤,然后發(fā)送出去,又得讀一遍本地硬盤,不是浪費(fèi)了這兩次IO么?當(dāng)然系統(tǒng)會帶IO緩存,耗時不一定會大。而轉(zhuǎn)base64則編碼效率比二進(jìn)制至少低1/4(相當(dāng)于8bit的數(shù)據(jù)只能編碼成6bit的數(shù)據(jù)),所以,我還是希望能支持直接把二進(jìn)制數(shù)據(jù)傳到后端為好。
興奮之余遇到一個問題,ByteString是okhttp3的websocket發(fā)送支持的數(shù)據(jù)類型,不是AutoX.js默認(rèn)支持的數(shù)據(jù)類型,要把image的字節(jié)數(shù)組轉(zhuǎn)成ByteString得依賴于okio這個外部庫里的ByteString這個類的方法。
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"]); //導(dǎo)入包
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("正在關(guān)閉");},onClosed: function (webSocket, code, response) {print("已關(guān)閉");},onFailure: function (webSocket, t, response) {print("錯誤");print( t);}
}var webSocket= client.newWebSocket(request, new WebSocketListener(myListener));
setInterval(() => { // 防止主線程退出
}, 1000);
websocket服務(wù)端是這樣的:
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');
});
這樣就完成了前端抓圖直接傳到后端保存圖片的流程
此前還擔(dān)心ByteString這種數(shù)據(jù)類型需要okhttp的websocketlistener來解析處理,由于okhttp只有websocket客戶端,還不支持websocket服務(wù)器,所以還需要一個websocket服務(wù)器來轉(zhuǎn)發(fā)請求到另一個websocket客戶端來用websocketlistener來處理收到的ByteString數(shù)據(jù),當(dāng)然也能正常工作,不過實驗證明是不需要的了。