1

Я пытаюсь сделать расширение chrome, которое вызывает java-код на моем ПК. Вызов работает нормально, код выполняется, но я пытаюсь вернуть переменные в chrome extension, но не работает. Я вижу в консоли, что слушатель onDisconect пишет консольное сообщение, но слушателю onMessage нет. Я не знаю проблемы.Расширение Java и 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"); 

А вот мои локальные файлы.

.bat

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

Родной протокол обмена сообщениями

Хром начинает каждый родной хост обмена сообщениями в отдельный процесс и взаимодействует с ней с помощью стандартного ввода (STDIN) и стандартный вывод (STDOUT). Тот же формат используется для отправки сообщений в обоих направлениях: каждое сообщение сериализуется с использованием JSON, UTF-8, закодированного , и ему предшествует длина 32-разрядного сообщения в собственном байтном порядке. Максимальный размер одного сообщения с основного почтового узла составляет 1 МБ, в основном для защиты Chrome от неправильного использования собственных приложений. Максимальный размер сообщения, отправленного на собственный сервер обмена сообщениями , составляет 4 ГБ.

Источник: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(); 

Update:

Это также выглядит, как вы упускаете тип интерфейса, который должен быть указан в вашем файле манифеста.

Добавить это: "type": "stdio"

+0

Я стараюсь это, и ничего, консоль говорит то же самое, я пытаюсь изменить .js и теперь, как это: chrome.runtime.sendNativeMessage ('com.app. native ', {text: "Hello"}, function (response) { console.log («Received» + response); }); И сообщение в консоли «Received undefined» –

+0

@MarcosPires См. Обновление к моему ответу. В вашем манифесте отсутствует тип интерфейса 'stdio'. Вы используете 'System.out', что эквивалентно' stdout'. –

+0

@Peter Если вы говорите, что включаете «тип» в манифест локального файла, у меня есть его, и формат: '{" name ":" com.app.native ", " description ":" Ваши причины транспортировки " "путь": "C:/Users/PC/Desktop/нативное сообщение/native_app/prueba.bat", "типа": "STDIO", "allowed_origins": [ \t" хром-расширение : // dmclpldhhlhdmkmikdmgpcjpcnpikgpp/" ] }' Извините, что не включил его раньше. Я не понимаю вас с 'System.out', это нормально, или я ошибаюсь? –

Смежные вопросы