如何从本机应用程序发送消息到Chrome扩展程序?

时间:2013-08-08 19:39:09

标签: google-chrome-extension google-chrome-devtools

我已经阅读了文档,但仍然无法实现。 我有用C和Chrome扩展程序编写的桌面应用程序。我知道如何在我的Chrome扩展程序中收到此消息:

port.onMessage.addListener(function(msg) {
    console.log("Received" + msg);
});

我应该在C应用程序中写什么来向Chrome扩展程序发送消息? Python / NodeJS示例也是合适的。

3 个答案:

答案 0 :(得分:12)

为了让本机消息传递主机将数据发送回Chrome,您必须先发送四个字节的长度信息,然后将JSON格式的消息作为字符串/ char-array发送。

以下是C和C ++的两个示例,它们以稍微不同的方式执行相同的操作。

C示例:

#include <stdio.h>
#include <string.h>

int main(int argc, char* argv[]) {
    // Define our message
    char message[] = "{\"text\": \"This is a response message\"}";
    // Collect the length of the message
    unsigned int len = strlen(message);
    // We need to send the 4 bytes of length information
    printf("%c%c%c%c", (char) (len & 0xff),
                       (char) ((len>>8) & 0xFF),
                       (char) ((len>>16) & 0xFF),
                       (char) ((len>>24) & 0xFF));
    // Now we can output our message
    printf("%s", message);
    return 0;
}

C ++示例:

#include <string.h>

int main(int argc, char* argv[]) {
    // Define our message
    std::string message = "{\"text\": \"This is a response message\"}";
    // Collect the length of the message
    unsigned int len = message.length();
    // We need to send the 4 bytes 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 << message;
    return 0;
}

(实际的消息可以与长度信息同时发送;为了清楚起见,它只是分解。)

因此,按照OP Chrome示例,以下是输出消息的方法:

port.onMessage.addListener(function(msg) {
    console.log("Received" + msg.text);
});

实际上,没有要求使用“text”作为从本机消息传递应用程序返回的密钥;它可能是任何东西。从本机消息传递应用程序传递给侦听器的JSON字符串将转换为JavaScript对象。

对于将上述技术与jsoncpp(C ++ JSON库)结合使用的本机消息传递应用程序的C ++示例,并解析发送给应用程序的请求,请参阅此处:https://github.com/kylehuff/libwebpg/blob/22d4843f41670d4fd7c4cc7ea3cf833edf8f1baf/webpg.cc#L4501

答案 1 :(得分:7)

你可以看看这里,这是一个示例python脚本,它向扩展发送和接收消息: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/host/native-messaging-example-host?revision=227442

据我了解,为了发送您需要的消息:

  1. 以控制方式向控制台写入消息长度
  2. 写三个\ 0个字符
  3. 以纯文本撰写邮件
  4. 这是为我完成工作的C#代码:

    String str = "{\"text\": \"testmessage\"}";
    
    Stream stdout = Console.OpenStandardOutput();
    
    stdout.WriteByte((byte)str.Length);
    stdout.WriteByte((byte)'\0');
    stdout.WriteByte((byte)'\0');
    stdout.WriteByte((byte)'\0');
    Console.Write(str);
    

    以上链接中的python代码:

    sys.stdout.write(struct.pack('I', len(message)))
    sys.stdout.write(message)
    sys.stdout.flush()
    

    有趣的是它没有显式输出三个\ 0字符,但它们似乎在输出struct.pack后出现,不知道为什么......

    另请注意,您需要以JSON格式发送消息,否则它似乎无法正常工作。

答案 2 :(得分:1)

我使用了函数

write(1,buf,n);

buf是你的消息,如果你的消息,则n是长度 你也可以使用printf。