- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我确实写了一个 chrome 扩展。我的内容脚本通过 background.js
发送一些数据。我的 background.js
shell 将此数据转发到本地 C++ 应用程序。现在发生的是,我的 background.js
可以连接到本地应用程序并发送一次数据。但是随后,连接断开,因为断开连接事件发生并且第二个发送请求失败。阅读 connectNative 的文档,它说,如果调用 disconnect
或“当包含端口的页面被卸载时”,连接将关闭。我的代码中根本没有断开连接,并且 background.js
不应卸载,因为根据文档 background.js
的实时时间与扩展名。使用我的代码,测试 1 和测试 2 在目标文件 Test.txt
中到达一次,但第二次发送失败,因为两者之间的连接丢失。
这里是代码。
背景.js:
var port = null;
var firstTime;
function onNativeMessage(message) {
console.log("Native Message received: " + message);
}
function onDisconnected() {
console.log("Disconnected");
//port = null;
}
function connect() {
console.log("Connect");
//port = chrome.extension.connectNative('chromeinterface');
port = chrome.runtime.connectNative('chromeinterface');
port.onMessage.addListener(onNativeMessage);
port.onDisconnect.addListener(onDisconnected);
}
chrome.extension.onRequest.addListener(function(data, sender) {
if(firstTime !== 'xdefined') {
firstTime = 'xdefined';
connect();
}
port.postMessage("Test 1");
port.postMessage("Test 2");
console.log("Send");
}
});
list .json:
{
"name": "Test",
"version": "1.0",
"description": "Test native messaging",
"background": {
"scripts": ["background.js"]
},
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["contentscript.js"]
}
],
"permissions": ["tabs", "nativeMessaging", "<all_urls>"],
"manifest_version": 2
}
chromeinterface.json:
{
"name": "chromeinterface",
"description": "Chrome Native Messaging API Example Host",
"path": "chrome_interface",
"type": "stdio",
"allowed_origins": [
"chrome-extension://abc.../"
]
}
chrome_interface.cpp:
...
using namespace std;
void StoreData(string data)
{
ofstream File;
File.open("Test.txt", ios_base::out|ios_base::app);
if (File.is_open())
{
File << data;
File.close();
}
}
int main(int argc, char* argv[])
{
std::cout.setf( std::ios_base::unitbuf );
unsigned int a, c, i, t=0;
std::string inp;
bool bCommunicationEnds = false;
StoreData("Start " + inp + "\n");
cout << "Start" << endl;
do {
inp="";
t=0;
// Sum the first 4 chars from stdin (the length of the message passed).
for (i = 0; i <= 2; i++) {
t += getchar();
}
// Loop getchar to pull in the message until we reach the total
// length provided.
for (i=0; i < t; i++) {
c = getchar();
if(c == EOF)
{
bCommunicationEnds = true;
i = t;
}
else
{
inp += c;
}
}
StoreData("Received " + inp + "\n");
if(!bCommunicationEnds)
{
//Collect the length of the message
unsigned int len = inp.length();
//// We need to send the 4 btyes of length information
std::cout << char(((len>>0) & 0xFF))
<< char(((len>>8) & 0xFF))
<< char(((len>>16) & 0xFF))
<< char(((len>>24) & 0xFF));
//// Now we can output our message
std::cout << inp;
}
}while(!bCommunicationEnds);
StoreData("Com end\n");
return 0;
}
控制台日志:
Connect
Send
Disconnected
Error in event handler for extension.onRequest: Attempting to use a disconnected port object
最佳答案
删除 cout << "Start" << endl;
从你的代码。 native 消息传递通过标准输入和标准输出进行通信。如果您在 stdout 中插入任何其他垃圾,则会违反协议(protocol),Chrome 将终止 native 应用程序。
除此之外,下面的内容看起来不像是“读取 4 个字符”,而是“读取 3 个字符”。
// Sum the first 4 chars from stdin (the length of the message passed).
for (i = 0; i <= 2; i++) {
t += getchar();
}
即使在更改 i <= 2
之后至 i < 4
,这仅适用于最多 255 个字节的消息,因为您要对各个字节求和,而不是将四个字节解释为一个整数。我建议将之前的代码片段替换为:
unsigned int t;
std::cin.read(reinterpret_cast<char*>(&t), sizeof(t));
从终端启动 Chrome 并查看终端内的标准输出以获得更多有用的错误以调试 native 应用程序。
关于google-chrome-extension - connectNative 在 Chrome 扩展程序中自行断开连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24775096/
是否可以在蓝牙设备连接到 iOS 或从 iOS 断开连接时收到通知,即使我的应用程序处于后台?在 Android 上,我使用 ACTION_ACL_CONNECTED 和 ACTION_ACL_DIS
我对使用 Delphi 使用 USB 设备感到不舒服,并且对编写设备驱动程序的细节几乎一无所知(尽管我在学习使用 GoASM 进行汇编时遇到过一些)。 该设备可以是 USB 调制解调器或 USB 打印
我正在使用 java/servlet 和前端 JSP 开发 Web 应用程序。 我的页面为用户显示一些信息。 是否有任何适当的方法来检查网络连接是否处于 Activity 状态(开/关)以及支持所有浏
这个问题在这里已经有了答案: C# -- TcpListener.Start() causing SocketException with message "Only one usage of ea
我想向我的应用程序添加功能,以允许在 Windows 操作系统上检测播放/捕获设备的到达和断开连接。就像在 Skype 中一样 - 当您拔下设备时 - 它会显示设备丢失的通知,例如要求您选择另一个。
如何断开 org. apache. http. client.HttpClient 对象? 我正在这样创建它,但它没有任何 disconnect() 或 getHttpConnectionManage
我们正在开发一个 .NET 应用程序,其中一个要求是监视系统是否连接到 Internet。 我们能够获得“以太网电缆断开连接”的 .NET 事件,但如果调制解调器被重置,则不会触发此事件。我不想一直通
我正在尝试与使用自签名证书的后端服务器建立 websocket 连接。在 Firefox 中,我为自签名证书添加了一个异常(exception)。 但是我的 websocket 连接 wss://连接
我正在使用由 Excel 生成的用户窗体来修改 PowerPoint 演示文稿(这是避免需要启用宏的电子表格的迂回方法)。该表单工作得很好,但每次我将焦点放在它上时,Excel 应用程序都会获得焦点(
您好,我成功地开始了视频通话,但是当我断开视频通话时,摄像头 LED 指示灯仍然亮着。我怎样才能完全断开通话? Video.createLocalVideoTrack().then(track =>
您好,我成功地开始了视频通话,但是当我断开视频通话时,摄像头 LED 指示灯仍然亮着。我怎样才能完全断开通话? Video.createLocalVideoTrack().then(track =>
我正在尝试断开客户端与服务器的连接,但服务器仍将其视为已连接。我找不到解决这个问题的方法,关机、断开连接和关闭都不起作用。 我与客户端断开连接并检查服务器的一些代码: 客户: private vo
我正在使用 magic record 来完成我所有的核心数据工作。 一切都很好,除了有时我在后台进行更新时我需要从上下文中分离或断开实体。 例如 ButtonList = [Buttons MR_fi
我正在尝试实现一个颜色选择器,它从屏幕上各处的像素中获取颜色。为此,我计划使用全局鼠标 Hook 来监听 WM_MOUSEMOVE,以便在鼠标四处移动时更新颜色,并监听鼠标点击以确认 (WM_LBUT
我有一个使用 C# 编写的 TLS 连接的客户端/服务器 TCP 场景。 客户端在安静并恢复后无法传递消息(不活动时间约为 25 分钟)。但如果我让客户聊天(每 30 秒),就没有问题。 客户端和服务
我编写的这段代码完美运行,但我担心每 2 秒执行一次 ping 操作会消耗太多资源,或者可能导致互联网连接出现一些问题。 new Thread(() => {
关闭带有附加 MediaPlayer 的 MediaController 的正确方法是什么? 您不能执行 mediaController.setMediaPlayer(null) - 立即调用 upd
从我的笔记本电脑上断开外接显示器后,我丢失了一些应用程序,因为断开连接的显示器仍设置为默认显示器。我的一些窗口试图在断开连接的显示器上显示。 我有一个解决方法,例如右键单击应用程序图标并选择移动,然后
是否可以将分片节点从分片集中取出并独立运行? 例如,每个分片都有一个特定的客户。 谢谢。 最佳答案 是的,这是可能的。 MongoDB“主”节点不知道分片。只有路由器(和配置服务器)知道。如果您使用正
我正在探索 Cassandra 及其复制系统。为此,我在本地创建了 3 个节点并测试了不同的场景。我想暂停节点之间的通信,用相同的键写入不同的值,然后观察它们将决定什么。 那么问题来了:如何限制节点在
我是一名优秀的程序员,十分优秀!