Netty Protobuf и использование Google Csharp Proto - PullRequest
4 голосов
/ 06 мая 2011

Я хочу связать клиентское приложение C # с серверным приложением Java. Java использует Netty framework с конвейерным протокольным энкодером.

Мой файл Proto: импорт "google / protobuf / csharp_options.proto";

option (google.protobuf.csharp_file_options).namespace = "ChatClient.LoginProtocol";
option (google.protobuf.csharp_file_options).umbrella_classname = "LoginProtocol";

option optimize_for = SPEED;

message Credential {
   required string email = 1;
   required string password = 2;

}

Netty конвейерные кодеки:

p.addLast("frameDecoder", new ProtobufVarint32FrameDecoder());
p.addLast("protobufDecoder", new   ProtobufDecoder(LoginProtos.Credential.getDefaultInstance()));

    p.addLast("frameEncoder", new ProtobufVarint32LengthFieldPrepender());
    p.addLast("protobufEncoder", new ProtobufEncoder());

Так как я могу отправить сообщение на сервер Java. код c #:

stream = client.GetStream();
sReader = new StreamReader(stream);
sWriter = new StreamWriter(stream);

Credential.Builder builder = Credential.CreateBuilder();

 builder.SetEmail("xxx@gmail.com").SetPassword("12356");

 sWriter.Write(builder.Build().ToByteArray());

 sWriter.Flush();

Спасибо за помощь и извините за мой английский.

Ответы [ 2 ]

5 голосов
/ 16 октября 2011

Возможно, уже слишком поздно, но я чувствую себя доброжелательно, поэтому на случай, если у кого-то возникнет похожий вопрос:

Об инфраструктуре

Нетти просто поможет вам с общим кодом котельной плитыэто относится к настройке сервера (сервер любого типа , поскольку Netty "независим от транспорта", поэтому вы можете реализовать его для использования TCP / IP, UDP и т. д.).Существует нет предопределенного сетевого протокола, который вы должны придерживаться для связи с вашим сервером (который работает с использованием Netty).То, что эффективно определяет ваш протокол, это ваш конвейер.Следовательно, с точки зрения клиента то, используете ли вы Netty на стороне сервера, не имеет значения.

О вашей проблеме

В вашем конвейере (при условии, что это ваш сервер)pipe) вы определили кодировщики и декодеры protobuf.Они сделают следующее:

  • Сервер -> Клиент: предположим, что отправляемый сервером объект является протобуфом MessageLite, декодируйте его в байты и отправьте эти байтыпо сети
  • Клиент -> Сервер: предположим, что клиент отправляет серию байтов, которые можно декодировать в объект protobuf, и декодируйте его, если это возможно

если вы использовали Java-клиент для тестирования вашего сервера и ваш сервер работает, то вы почти закончили работу с вашим сервером.Все, что вам нужно сделать сейчас, это использовать библиотеку C #, которая преобразует объекты в сообщения protobuf, подключается к вашему серверу Java и отправляет байты.

Преобразование объектов в C # в сообщения protobuf должно быть простым: useодна из библиотек protobuf C # из сторонних инструментов на странице проекта protobuf, чтобы сделать это.Подключение к вашему серверу и отправка байтов сообщения protobuf - это то, что вам нужно реализовать самостоятельно.По сути, это не должно быть намного сложнее, чем создание сокета для конечной точки вашего сервера, сериализация сообщения protobuf в байты и отправка этих байтов через сокет на сервер.Надеемся, что это ответ на ваш вопрос.

Подводя итог: Netty - это среда Java, которую вы использовали для реализации сервера.Google protobuf - это фреймворк, который вы использовали для определения ваших сообщений (точнее контракта (ов) ).На этом этапе обязательным условием для клиента для связи с вашим сервером является то, что клиент отправляет сообщения protobuf.Нетти не имеет значения для клиента.

0 голосов
/ 26 марта 2014

Возможно, уже слишком поздно, но для тех, у кого есть эта проблема, надеюсь, это поможет.

Как уже упоминалось в документах для protobuf-csharp-port,

Если вам нужен один файл .proto, который может генерировать код Java и код C #, вам просто нужны параметры Java и параметры C #. Они вообще не конфликтуют.

https://code.google.com/p/protobuf-csharp-port/wiki/GettingStarted

Что вам нужно сделать, так это убедиться, что импорт csharp интерпретируется вашим инструментом сборки Java или наоборот. Таким образом, вы можете включить файл csharp_options.proto в свой проект Java; этот файл поставляется с исходными кодами protobuf-csharp-port.

...