2013-08-08 42 views
10

Tôi đã đọc tài liệu, nhưng vẫn không thể nhận ra. Tôi có ứng dụng dành cho máy tính để bàn được viết bằng phần mở rộng C và Chrome. Tôi biết cách nhận thư này trong tiện ích mở rộng chrome của mình:Cách gửi tin nhắn TỪ ứng dụng gốc tới tiện ích của Chrome?

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

Tôi nên viết gì trong ứng dụng C để gửi thư đến tiện ích mở rộng chrome của mình? Ví dụ về Python/NodeJS cũng phù hợp.

+1

Bạn đã đọc https://developer.chrome.com/extensions/messaging.html#native-messaging? –

+2

Tôi đã làm, và nó không trả lời câu hỏi? –

Trả lời

12

Để máy chủ nhắn tin gốc gửi dữ liệu trở lại Chrome, trước tiên bạn phải gửi bốn byte thông tin về độ dài và sau đó gửi tin nhắn được định dạng JSON dưới dạng chuỗi/mảng char.

Dưới đây là hai ví dụ cho C và C++ tương ứng làm điều tương tự theo những cách hơi khác nhau.

C Ví dụ:

#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++ ví dụ:

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

(. Thông điệp thực tế có thể được gửi vào cùng thời điểm với thông tin thời gian, nó chỉ đơn thuần được chia ra cho rõ ràng)

Vì vậy, sau ví dụ về OP Chrome, dưới đây là cách xuất thông báo:

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

Trong thực tế, không có yêu cầu sử dụng "văn bản" làm khóa được trả về từ ứng dụng nhắn tin gốc của bạn; nó có thể là bất cứ điều gì.Chuỗi JSON được truyền cho người nghe từ ứng dụng nhắn tin gốc của bạn được chuyển đổi thành một đối tượng JavaScript.

Đối với một C++ ví dụ về một ứng dụng nhắn tin gốc có sử dụng các kỹ thuật nói trên kết hợp với jsoncpp (thư viện C++ JSON) và cũng có thể phân tích các yêu cầu gửi đến ứng dụng, xem tại đây: https://github.com/kylehuff/libwebpg/blob/22d4843f41670d4fd7c4cc7ea3cf833edf8f1baf/webpg.cc#L4501

+0

Kính gửi @ kylehuff, tôi muốn sử dụng một dll C++ (winscard.dll) thông qua tin nhắn bản địa cho phần mở rộng trình duyệt chrome, tuy nhiên tôi không thể thực hiện kết nối này. Có thể thực hiện giao tiếp này thông qua 'tin nhắn gốc' không? –

1

tôi đã sử dụng chức năng ghi:

write(1,buf,n); 

buf là thông điệp của bạn, n là chiều dài nếu thông điệp của bạn Bạn cũng có thể sử dụng printf.

+2

Tôi đang cố gắng giải quyết vấn đề tương tự này. Tôi thấy làm thế nào tôi có thể nhận được tin nhắn nhưng tôi không rõ ràng về cách gửi nó. Bài đăng này có ngụ ý rằng mọi thứ được viết ra tiêu chuẩn sẽ được chuyển tới bất kỳ ứng dụng chrome nào đang nghe tin nhắn không? Ứng dụng gốc của tôi là ứng dụng bảng điều khiển .Net. Điều đó có nghĩa là mọi thứ được gửi tới Console.WriteLine sẽ kết thúc với Chrome không? – Kywillis

+0

@Kywillis lúc đầu tôi cũng bối rối sau đó đọc các tài liệu giải thích rằng nó sử dụng stdio nhưng máy chủ phải được đăng ký và bạn có thể chỉ định phần mở rộng bạn cho phép giao tiếp với trong tệp kê khai. https://developer.chrome.com/extensions/nativeMessaging – Reem

7

Bạn có thể có một cái nhìn ở đây, đây là một python script ví dụ mà gửi và nhận các tin nhắn đến phần mở rộng: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/nativeMessaging/host/native-messaging-example-host?revision=227442

Theo như tôi được biết, để gửi thông điệp mà bạn cần phải:

  1. ghi vào an ủi độ dài của thông điệp như bynary
  2. ghi ba \ 0 ký tự
  3. viết tin nhắn của bạn trong văn bản đơn giản

này là mã C# mà đã làm các công việc cho tôi:

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

Và mã python từ liên kết ở trên:

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

Điều thú vị là nó không rõ ràng ra ba \ 0 ký tự, nhưng chúng dường như xuất hiện sau khi xuất ra struct.pack, không chắc chắn tại sao ...

Cũng lưu ý rằng bạn cần phải gửi thư ở định dạng JSON, nếu không nó có vẻ không hoạt động .

+3

4 byte đầu tiên thực sự và int chứa độ dài str theo byte. Vì vậy, giải pháp của bạn sẽ thất bại nếu str đi trên 256 byte. Ngoài ra, bạn có thể muốn chỉ định mã hóa luồng đầu ra thành UTF-8, nó có thể là mặc định nhưng chỉ trong trường hợp. – hultqvist

+0

@phq Cảm ơn bạn đã làm rõ! –

Các vấn đề liên quan