gpt4 book ai didi

javascript - 使用 WebSocket 传递二进制数据

转载 作者:行者123 更新时间:2023-12-02 17:08:58 25 4
gpt4 key购买 nike

我正在编写一个 Firefox 扩展,并且正在搜索使用 WebSocket 传递压缩文件(服务器 here )。客户端(发送文件)的代码如下:

var ws = new window.WebSocket("ws://localhost:12345");

function sendLogToOtherClient(file){

var zippedFileToSend = zipLogFile(file);
NetUtil.asyncFetch(zippedFileToSend, function(inputStream, status) {
if (!components.isSuccessCode(status)) {
return;
}
var bstream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(Ci.nsIBinaryInputStream);
bstream.setInputStream(inputStream);
var bytes = bstream.readByteArray(bstream.available());
bstream.close();
var encodedData = base64.encode(bytes, "utf-8");
ws.send(encodedData);
});
}
function zipLogFile(fileToZip){
var zippedFile = FileUtils.getFile("ProfD", ["report1.zip"], false);
var zipWriter = CCIN("@mozilla.org/zipwriter;1", "nsIZipWriter");
zipWriter.open(zippedFile, FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_TRUNCATE);
zipWriter.addEntryFile("logfile.txt", zipWriter.COMPRESSION_BEST, fileToZip, false);
zipWriter.close();
return zippedFile;
}

这适用于服务器端(接收文件并写入新的压缩文件):

server = new WebSocketServer(12345);
server.onclient = function(client) {
console.log(client + " connected");

client.onmessage = function(client, msg) {
client.send("Log Received");
var zippedTmpFile = FileUtils.getFile("ProfD", ["report2.zip"], false);
asyncTmpSave(zippedTmpFile, msg, onDone)

};
};
server.connect();

function asyncTmpSave(file, data, callbackDone){
var ostream = FileUtils.openFileOutputStream(file, FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | FileUtils.MODE_TRUNCATE);
var converter = CCIN('@mozilla.org/intl/scriptableunicodeconverter', "nsIScriptableUnicodeConverter");
converter.charset = 'UTF-8';
var istream = converter.convertToInputStream(data);

NetUtil.asyncCopy(istream, ostream, callbackSaved);
function callbackSaved (status) {
if(callbackDone){
if(status===0)callbackDone( file.path, file.leafName, status); //sucess.
else callbackDone( null, null, status); //failure.
};
}
}
function onDone(path, leafName, statusCode){
console.log([statusCode===0?"OK":"error",path,leafName].join("\n"));
}

我尝试传递字符串并且通信正常,在这种情况下,数据已传递并创建了文件,但 .zip 文件已损坏。你有什么想法?谢谢

最佳答案

你不能用 utf-8 编码随机的二进制内容。

WebSockets(和我的服务器)支持类型化数组。

所以你在发送需求时会:

var bytes = new Uint8Array(bstream.available());
bstream.readArrayBuffer(bytes.byteLength, bytes.buffer);
bstream.close();
ws.send(bytes);

在接收端您将收到 Uint8Array也是如此。

关于javascript - 使用 WebSocket 传递二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24998779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com