我正在使用 Chrome 的Native Messaging API将页面的 DOM 传递给我的主机。当我尝试将一个小字符串从我的扩展程序传递到我的主机时,一切正常,但是当我尝试传递整个 DOM(不是那么大......只有大约 260KB)时,一切都运行得慢得多,我最终得到一个Native host has exited error
阻止主机响应。
我的主要问题:为什么将 250KB - 350KB 的消息从扩展程序传递到主机需要这么长时间?
根据开发者的网站:
Chrome 在单独的进程中启动每个本机消息传递主机,并使用标准输入 (stdin) 和标准输出 (stdout) 与其通信。相同的格式用于双向发送消息:每条消息都使用 JSON 序列化,UTF-8 编码,并以原生字节顺序的 32 位消息长度开头。来自原生消息传递主机的单个消息的最大大小为 1 MB,主要是为了保护 Chrome 免受行为不端的原生应用程序的影响。发送到本机消息传递主机的消息的最大大小为 4 GB。
我有兴趣发送到我的主机的页面的 DOM 不超过 260KB(有时是 300KB),远低于 4GB 的最大值。
popup.js
document.addEventListener('DOMContentLoaded', function() {
var downloadButton = document.getElementById('download_button');
downloadButton.addEventListener('click', function() {
chrome.tabs.query({currentWindow: true, active: true}, function (tabs) {
chrome.tabs.executeScript(tabs[0].id, {file: "getDOM.js"}, function (data) {
chrome.runtime.sendNativeMessage('com.google.example', {"text":data[0]}, function (response) {
if (chrome.runtime.lastError) {
console.log("Error: " + chrome.runtime.lastError.message);
} else {
console.log("Response: " + response);
}
});
});
});
});
});
主机程序
private static string StandardOutputStreamIn() {
Stream stdin = new Console.OpenStandardInput();
int length = 0;
byte[] bytes = new byte[4];
stdin.Read(bytes, 0, 4);
length = System.BitConverter.ToInt32(bytes, 0);
string = "";
for (int i=0; i < length; i++)
string += (char)stdin.ReadByte();
return string;
}
请注意,我从这个问题中找到了上述方法。
目前,我只是想将字符串写入 .txt 文件:
public void Main(String[] args) {
string msg = OpenStandardStreamIn();
System.IO.File.WriteAllText(@"path_to_file.txt", msg);
}
- 将字符串写入文件需要很长时间(约 4 秒,有时长达 10 秒)。
实际写入的文本量各不相同,但绝不是顶部文档声明和一些 IE 注释标记。现在所有文本都显示出来了。这个几乎没有任何文本的文件是 649KB,但实际文件应该只有 205KB(当我下载它时)。该文件仍略大于应有的大小(应为 205KB 时为 216KB)。
我已经getDOM.js
通过下载文件测试了我的功能,整个过程几乎是瞬间完成的。
我不确定为什么这个过程要花这么长时间,为什么文件这么大,或者为什么实际上几乎没有任何消息被发送。
我不确定这是否与以特定方式反序列化消息有关,我是否应该创建一个端口而不是使用该chrome.runtime.sendNativeMessage(...);
方法,或者我是否完全缺少其他东西。
非常感谢所有帮助!谢谢!
编辑
虽然我的消息正确地从分机发送到主机,但我现在Native host has exited error
在分机接收主机消息之前收到一条消息。