Я пытаюсь сделать расширение 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);
}
}