村农

莫笑农家腊酒浑,丰年留客足鸡豚。


chrome nativeMessagin

冬冬

这两天整chrome extension和本地通信,也是突发好奇对nativeMessaging这个API感兴趣。结果怎么查,都找不到文档。网上的例子翻来覆去也就那么几个。 自己按着例子走了一遍,对这个有了一定的熟悉。在此记录下,为下次深入做准备吧。也不写很详细的文章,只是方便自己下次查找。

文章链接: 【干货】Chrome插件(扩展)开发全攻略

Chrome扩展及应用开发(首发版)

Chrome浏览器扩展开发系列之十四:本地消息机制Native messaging

Chrome 插件: 起动本地应用 (Native messaging)

相关的文章还很多,就不列举了。 以下是代码:

manifest.json

{
    “manifest_version”: 2,
    “name”: “Invoke Native Application”,
    “description”: “example”,
    “version”: “1.0”,
    “browser_action”: {
    “default_icon” : “icon.png”,
    “default_popup”: “popup.html”
    },
    “permissions”: [
        “nativeMessaging”
    ]
}

popup.html (由于以前用的百度编辑器,把html当代码执行了......)

popup.js

function updateResult(obj, state){
    document.getElementById(obj).innerHTML = state;
}
function invoke(){
    var hostName = “com.google.chrome.demo”;
    var port = chrome.runtime.connectNative(hostName);
    updateResult(“result1”, “invoke..”);
    port.onMessage.addListener(function(msg){
    console.log(“received” + msg);
})
// port.onDisconnect.addListener(function(){
//     console.log(“Disconnected”);
// })
    port.postMessage({text:’Hello,my_application’});
}
function listener(){
    updateResult(“result2”, “listen”);
}
document.addEventListener(‘DOMContentLoaded’, function() {
    document.querySelector(‘#button1’).addEventListener(‘click’, invoke);
});

com.google.chrome.demo-win.json

{
    “name”: “com.google.chrome.demo”,
    “description”: “Chrome Native Messaging API Example Host”,
    “path”: “C:MyApp.exe”,//本地程序路径
    “type”: “stdio”,
    “allowed_origins”: [
        “chrome-extension://ckijbdojhondckilklaiohghgeadljhp/“
    ]
}

当然还有个很重要的东西,就是要在注册表指出com.google.chrome.demo-win.json的位置。

本地消息的协议约束

客户端的本地应用注册为Chrome浏览器扩展的“本地消息主机”之后,Chrome浏览器会在独立的进程中启动该本地应用,并通过标准输入/输出流(stdin/stdout)进行消息通信。

Chrome浏览器扩展与客户端的本地应用之间的双向通信采用消息机制,该消息以JSON格式,UTF-8编码,带32位(操作系统本地字节序)的消息长度作为前缀。从本地应用发送到Chrome浏览器扩展的消息,最大尺寸是1M字节。从Chrome浏览器扩展发送到本地应用的消息,最大尺寸是4G字节。

标准输入/输出流(stdin/stdout)进行消息通信

在linux中把所有东西都看作是文件来处理,比如打印机,比如网卡,比如声卡等等

stdin也是一个文件

stdout 也是一个文件

每当启动一个进程的时候,都会有一个默认的stdin和stdout生成,

默认情况下,stdin就是键盘

默认情况下,stdout就是显示器

比如C语言中

prinf(“这是一句没有意义的话”);
//相当于
fprintf(stdout,”这是一句没有意义的话”)