2015-06-17 5 views
19

Я потратил несколько часов на то, чтобы узнать, как получить встроенный обмен сообщениями в Chrome, используя собственный C# -сервер. Концептуально это было довольно просто, но там было несколько коряг, что я решил с помощью (частично) от этих других вопросов:Собственный хост C# с общими сообщениями в Chrome

Native Messaging Chrome
Native messaging from chrome extension to native host written in C#
Very Slow to pass "large" amount of data from Chrome Extension to Host (written in C#)

Мое решение размещен ниже.

ответ

24

Предполагая, что манифест настроен правильно, вот полный пример для разговора с C# хосту с помощью «порта» метод:

using System; 
using System.IO; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 

namespace NativeMessagingHost 
{ 
    class Program 
    { 
     public static void Main(string[] args) 
     { 
     JObject data; 
     while ((data = Read()) != null) 
     { 
      var processed = ProcessMessage(data); 
      Write(processed); 
      if (processed == "exit") 
      { 
       return; 
      } 
     } 
     } 

     public static string ProcessMessage(JObject data) 
     { 
     var message = data["text"].Value<string>(); 
     switch (message) 
     { 
      case "test": 
       return "testing!"; 
      case "exit": 
       return "exit"; 
      default: 
       return "echo: " + message; 
     } 
     } 

     public static JObject Read() 
     { 
     var stdin = Console.OpenStandardInput(); 
     var length = 0; 

     var lengthBytes = new byte[4]; 
     stdin.Read(lengthBytes, 0, 4); 
     length = BitConverter.ToInt32(lengthBytes, 0); 

     var buffer = new char[length]; 
     using (var reader = new StreamReader(stdin)) 
     { 
      while (reader.Peek() >= 0) 
      { 
       reader.Read(buffer, 0, buffer.Length); 
      } 
     } 

     return (JObject)JsonConvert.DeserializeObject<JObject>(new string(buffer)); 
     } 

     public static void Write(JToken data) 
     { 
     var json = new JObject(); 
     json["data"] = data; 

     var bytes = System.Text.Encoding.UTF8.GetBytes(json.ToString(Formatting.None)); 

     var stdout = Console.OpenStandardOutput(); 
     stdout.WriteByte((byte)((bytes.Length >> 0) & 0xFF)); 
     stdout.WriteByte((byte)((bytes.Length >> 8) & 0xFF)); 
     stdout.WriteByte((byte)((bytes.Length >> 16) & 0xFF)); 
     stdout.WriteByte((byte)((bytes.Length >> 24) & 0xFF)); 
     stdout.Write(bytes, 0, bytes.Length); 
     stdout.Flush(); 
     } 
    } 
} 

Если вам не нужно активно общаться с хозяином, используя runtime.sendNativeMessage будет работать нормально. Чтобы предотвратить зависание хоста, просто удалите петлю while и выполните чтение/запись один раз.

Чтобы проверить это, я использовал пример проекта, предоставленную Google здесь: https://chromium.googlesource.com/chromium/src/+/master/chrome/common/extensions/docs/examples/api/nativeMessaging

Примечание: Я использую Json.NET, чтобы упростить процесс сериализации JSON/де-сериализации.

Надеюсь, это полезно кому-то!

+0

Я ищу это для Java, но я не могу найти нигде:/ – farukdgn

+0

@farukdgn В частности, что сложно найти? Реализация Java должна быть довольно схожей. – itslittlejohn

+0

Да, спасибо, это идеальный старт! – shaune