1

我嘗試做一個chrome擴展,調用我的PC中的java代碼。調用工作正常,代碼執行,但我嘗試將變量返回給Chrome擴展但不起作用。我在控制檯中看到,監聽器onDisconect編寫控制檯消息,但監聽器onMessage沒有。我不知道這個問題。Java和Chrome擴展,原生消息

這是我在Chrome擴展代碼:

JSON格式的清單

{ 
    "name": "Prueba native message", 
    "version": "1.0", 
    "manifest_version": 2, 
    "description": "Chrome extension interacting with Native Messaging and  localhost.", 
    "app": { 
    "background": { 
     "scripts": ["background.js"] 
    } 
}, 
    "icons": { 
    }, 
    "permissions": [ 
     "nativeMessaging" 
    ] 
} 

background.js

var port = chrome.runtime.connectNative('com.app.native'); 

function message(msg) { 
    console.warn("Received" + msg); 
} 

function disconect() { 
    console.warn("Disconnected"); 
} 

console.warn("se ha conectado"); 

port.onMessage.addListener(message); 
port.onDisconnect.addListener(disconect); 
port.postMessage({text: "Hello, my_application"}); 

console.warn("message send"); 

在這裏,我的本地文件。

蝙蝠

cd C:\Users\pc\IdeaProjects\eDNI\out\production\code && java Main 

Main.java

public class Main { 
    public static void main(String argv[]) throws IOException { 
     System.out.println("{\"m\":\"hi\""); 
    } 
} 

在這段代碼中,我只嘗試返回一個簡單的信息擴展。

回答

1

本地消息收發協議

Chrome啓動在 一個單獨的過程中的每個本地消息主機,並使用標準輸入 (標準輸入)和標準輸出(stdout)它進行通信。使用相同的格式在兩個方向上發送 消息:每個消息使用JSON進行序列化, UTF-8編碼爲,並且前面帶有32位消息長度,原生 字節順序。來自本地 郵件主機的單條郵件的最大大小爲1 MB,主要用於防止Chrome從本地應用程序中錯誤地操作 。發送到 本地郵件主機的郵件的最大大小爲4 GB。

來源:Native Messaging Protocol

第一個四個字節需要是消息的長度。需要將消息長度,它是一個整數,則轉換爲一個字節數組:

選項1:使用java.nio.ByteBuffer

public byte[] getBytes(int length) { 
    ByteBuffer b = ByteBuffer.allocate(4); 
    b.putInt(length); 
    return b.array(); 
} 

選項2:手冊:

public byte[] getBytes(int length) { 
    byte[] bytes = new byte[4]; 
    bytes[0] = (byte) (length & 0xFF); 
    bytes[1] = (byte) ((length >> 8) & 0xFF); 
    bytes[2] = (byte) ((length >> 16) & 0xFF); 
    bytes[3] = (byte) ((length >> 24) & 0xFF); 
    return bytes; 
} 

寫出消息長度,然後寫出消息內容(以字節爲單位)。

String message = "{\"m\":\"hi\"}"; 
System.out.write(getBytes(message.length())); 
System.out.write(message.getBytes("UTF-8")); 
System.out.flush(); 

更新:

它也像你缺少需要在您的清單文件中指定的接口類型。

補充一點:"type": "stdio"

+0

我嘗試這一點,並沒有什麼,控制檯說的一樣,我試着改變.js文件,現在是這樣的: chrome.runtime.sendNativeMessage('com.app。本地', {text:「Hello」}, function(response){ console.log(「Received」+ response); }); 而在控制檯中的消息是「收到未定義」 –

+0

@MarcosPires查看我的答案更新。您在清單中缺少接口類型'stdio'。您正在使用'System.out',它等同於'stdout'。 –

+0

@Peter如果你說要包含本地文件的'type'in清單,我有它,格式是: '{「name」:「com.app.native」, 「description」:「您的設定「, 」路徑「:」C:/用戶/ PC /桌面/原生信息/ native_app/prueba.bat「, 」type「:」stdio「, 」allowed_origins「:[ \t」chrome-extension :// dmclpldhhlhdmkmikdmgpcjpcnpikgpp /「 ] }' 對不起,以前沒有包括。我不明白你用'System.out'它可以或我錯了嗎? –