мультиплексирование / демультиплексирование различных типов сообщений в потоке protobuf - PullRequest
0 голосов
/ 08 октября 2019

Я хотел бы отправить поток различных протобуф-сообщений по проводам и иметь возможность различать их по прибытии по мере их поступления.

Допустим, у меня есть * .proto, подобный этому:

message Book {
//...
}
message BlueRay{
//...
}

А затем и на стороне отправителя я сериализирую, скажем, следующую последовательность (псевдокод на C #):

Book1.WriteDelimitedTo(myStream);
BlueRay1.WriteDelimitedTo(myStream);
Book2.WriteDelimitedTo(myStream);

Как узнать порядок / типы сообщений, которые яполучать на стороне приемника? (Контракт доступен как на стороне отправителя, так и на стороне получателя). В зависимости от состояния моего отправителя, я не могу предположить / сказать, что будет отправлено и в каком порядке ...

Я понял, что нетвстроенный способ сделать это, как указано в документации , но, например, для размера сообщения был вспомогательный метод (вспомогательный метод CD API WriteDelimited для встраивания размера).

Какя могу сделать, чтобы получить / отобразить тип полученного сообщения?

Мой сервер будет написан на заданном языке (на самом деле C #), но мои клиенты должны быть "реализуемыми" в любой цели с поддержкой protobuf, поэтому я не хочу устанавливать что-то, что будет сериализовать C # / CLRвещи между ...

Может быть, я использую protobuf странным образом? Я пытаюсь настроить своего рода протокол.

1 Ответ

0 голосов
/ 17 октября 2019

Мне кажется, я наконец-то узнал, как это сделать (только в C # на данный момент).

По сути, я пишу следующее в поток:

  • Целевое имя дескриптора приходящего сообщения (в файле proto, поскольку оба конца разделяют это определение), используя примитив для сериализации строк
  • размер приходящего сообщения, используя примитив для сериализации размера
  • сериализованное сообщениев поток

В результате получается метод, подобный следующему:

public static void WriteToStream(Stream outputStream, IMessage message)
{
    MessageDescriptor stateMsgDescriptor = message.Descriptor;

    using (CodedOutputStream codedOutStr = new CodedOutputStream(outputStream, true))
    {
        codedOutStr.WriteString(stateMsgDescriptor.FullName);

        int size = message.CalculateSize();
        codedOutStr.WriteLength(size);

        message.WriteTo(codedOutStr);

        codedOutStr.Flush();
    }
}

Как указано здесь 1017 *,

Формат протокола Protocol Buffer не является саморазграничением, поэтому синтаксические анализаторы буфера протокола не могут самостоятельно определить, где заканчивается сообщение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...