Буферы протокола Google не читаются должным образом - PullRequest
0 голосов
/ 23 апреля 2019

Я просто настраиваю новый проект Java, который будет (возможно, не совсем уверен) сейчас использовать буфер протокола Google.Я новичок в этом API, поэтому я начал с очень простого теста.Тест, чей результат, честно говоря, действительно разочаровал меня.Почему этот очень простой код не работает?

var output = new ByteArrayOutputStream();
Message.Echo.newBuilder().setMsg("MSG1?").build().writeTo(output);
System.out.println("output.length " + output.toByteArray().length);
Message.Echo.newBuilder().setMsg("MSG2!!").build().writeTo(output);
System.out.println("output.length " + output.toByteArray().length);

var input = new ByteArrayInputStream(output.toByteArray());
System.out.println("input.available " + input.available());
System.out.print(Message.Echo.parseFrom(input));
System.out.println("input.available " + input.available());
System.out.print(Message.Echo.parseFrom(input));

Приведенный выше код выдает следующий вывод:

output.length 7
output.length 15
input.available 15
msg: "MSG2!!"
input.available 0

Он полностью пропускает первые сообщения или, скорее, кажется,«перезаписать» его каким-либо образом, так как все 15 байтов считываются.Кроме того, он не блокируется при втором вызове, учитывая, что больше нет байтов для чтения.

Однако изменение двух строк чтения на:

System.out.print(Message.Echo.parseFrom(input.readNBytes(7)));
System.out.print(Message.Echo.parseFrom(input.readNBytes(15-7)));

правильно печатает два сообщения.Я использую Kubuntu 18.04 с JDK 11. Я что-то упустил действительно важное (не упомянутое в официальном руководстве) или это ошибка?

Это файл .proto:

syntax = "proto3";

package ...;

option java_package = "...";
option java_outer_classname = "Message";

message Echo {
    string msg = 1;
}

1 Ответ

0 голосов
/ 25 апреля 2019

Хорошо, похоже, что для записи / чтения нескольких сообщений с использованием одного и того же набора потоков требуется использование writeDelimitedTo и parseDelimitedFrom вместо этого, потому что parseFrom читает пока не достигнет EOF.

Кажется, что предпочтительным поведением является использование нового сокета для каждого сообщения. Это звучит немного странно для меня, но я уверен, что есть веская причина для этого. Это должно быть лучше объяснено в официальном уроке.

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