Как сохранить долгосрочную связь между расширением chrome и собственным приложением? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь сделать расширение Chrome, чтобы сохранить долгосрочное соединение с нативным приложением (консольное приложение C #).Если щелкнуть значок «Обновить» на вкладке «Расширение», консольное приложение не активируется, и событие port.onDisconnect.addListener () сработало.Из просмотра представлений -> фоновой страницы я вижу:

    message: "Native host has exited."

Расширение Chrome может получить сообщение из консольного приложения C #, а консольное приложение C # может получить сообщение из расширения Chrome.В консольном приложении есть событие, после его запуска информация будет отправлена ​​расширению chrome с помощью функции Write ().Если я вручную запускаю консольное приложение, я могу видеть информацию в консольном приложении при возникновении события.

Консольное приложение:

    static void Main(string[] args)
    {
        string message = "test message from native application";
        Write(message);
        //Read();
        Thread thread = new Thread(Read);
        thread.Start();
        ScanInit();
    }


    public static void Write(string data)
    {
        var json = new JObject();
        json["data"] = data;
        var bytes = Encoding.UTF8.GetBytes(json.ToString(Formatting.None));
        int DataLength = bytes.Length;
        Stream stdout = Console.OpenStandardOutput();
        stdout.WriteByte((byte)((DataLength >> 0) & 0xFF));
        stdout.WriteByte((byte)((DataLength >> 8) & 0xFF));
        stdout.WriteByte((byte)((DataLength >> 16) & 0xFF));
        stdout.WriteByte((byte)((DataLength >> 24) & 0xFF));
        //Available total length : 4,294,967,295 (FF FF FF FF) 

        stdout.Write(bytes, 0, bytes.Length);
        //stdout.Flush();
    }

    public static void Read()
    {
        //// We need to read first 4 bytes for length information 
        Stream stdin = Console.OpenStandardInput();
        int length = 0;
        byte[] bytes = new byte[4];
        stdin.Read(bytes, 0, 4);
        length = System.BitConverter.ToInt32(bytes, 0);

        string input = "";

        for (int i = 0; i < length; i++)
        {
            input += (char)stdin.ReadByte();
        }

        //Write(input);
        return input;
    }

background.js

    var host_name = "myhost"; 
    var port = null; 

    var newport = connectToNative(); 

    function connectToNative() { 
        console.log('Connecting to native host: ' + host_name); 
        port = chrome.runtime.connectNative(host_name); 

        port.onMessage.addListener(onNativeMessage); 

        port.onDisconnect.addListener(onDisconnected); 
        sendNativeMessage("Message from chrome extension."); 

        return port;
    } 

    function sendNativeMessage(msg) { 
        var message = {data : msg}; 
        console.log('Sending message to native app: ' + JSON.stringify(message)); 
        port.postMessage(message); 
        console.log('Sent message to native app: ' + msg); 
    } 

    function onNativeMessage(msg) { 
        //alert('received messge from native app.');
        console.log(chrome.runtime.lastError);
        console.log('recieved message from native app: ' + JSON.stringify(msg)); 

        return true;
    } 

    function onDisconnected() { 
        console.log(chrome.runtime.lastError); 
        console.log('disconnected from native app.'); 
        port = null; 
    } 

Iхотите использовать chrome для активации консольного приложения, поддерживая долгоживущее соединение.Затем используйте port.disconnect () при необходимости.Ниже приведены фоновые страницы просмотра проверок:

    Connecting to native host: myhost
    Sending message to native app: {"data":"Message from chrome extension."}
    Sent message to native app: Message from chrome extension.

    undefined
    recieved message from native app: {"data":"test message from native application"}
    Objectmessage: "Native host has exited."
    get message: ƒ ()
    __proto__: Object
    disconnected from native app.

Обновление 1-е: После изменения кода кажется, что долговременное соединение работает.Но он не работает с обработчиком событий в консольном приложении.

static void Main(string[] args)
{
    string message = "test message from native application";
    Write(message);
    //Read();
    string data;
    while ((data = Read()) != null) // (Read() != null || Read() != "")
    {
         //Write("Received to Native App: " + Read());
         Write("Recieved: " + data);
    }

}
...