Как отправить сообщение FROM native app К расширению Chrome?

Я читал документы, но до сих пор не могу понять. У меня есть настольное приложение, написанное на расширении C и Chrome. Я знаю, как получить это сообщение в моем расширении chrome:

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

Что я должен написать в своем приложении C для отправки сообщения на мое расширение chrome? Примеры Python/NodeJS также подходят.

Ответ 1

Чтобы хост с собственными сообщениями отправил данные обратно в Chrome, вы должны сначала отправить четыре байта информации о длине, а затем отправить форматированное сообщение JSON в виде строки / char -array.

Ниже приведены два примера для 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;
}

Пример С++:

#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);
});

В действительности нет требования использовать "текст" в качестве ключа, возвращаемого из вашего приложения для обмена сообщениями; это может быть что угодно. Строка JSON, переданная слушателю из вашего приложения для обмена сообщениями, преобразуется в объект JavaScript.

Для примера С++ приложения с естественными сообщениями, которое использует вышеупомянутый метод в сочетании с jsoncpp (библиотека С++ JSON), а также анализирует запрос, отправленный в приложение, см. здесь: https://github.com/kylehuff/libwebpg/blob/22d4843f41670d4fd7c4cc7ea3cf833edf8f1baf/webpg.cc#L4501

Ответ 2

Вы можете посмотреть здесь, это пример python script, который отправляет и получает сообщения на расширение: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/host/native-messaging-example-host?revision=227442

Насколько я понимаю, для отправки сообщения вам нужно:

  • записывать в консоль длину сообщения как bynary
  • напишите три символа \0
  • написать свое сообщение в виде обычного текста

это код С#, который выполнил эту работу для меня:

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, иначе оно не работает.

Ответ 3

Я использовал функцию написать:

write(1,buf,n);

buf - ваше сообщение, n - длина, если ваше сообщение Вы также можете использовать printf.