Я использую protobuf уже несколько недель, но я все еще получаю исключения при разборе сообщений protobuf в Java .
Я использую C ++ для создания своих протобуф-сообщений и отправляю их с буст-сокетами в сокет сервера, где клиент Java слушает. Код C ++ для передачи сообщения:
boost::asio::streambuf b;
std::ostream os(&b);
ZeroCopyOutputStream *raw_output = new OstreamOutputStream(&os);
CodedOutputStream *coded_output = new CodedOutputStream(raw_output);
coded_output->WriteVarint32(agentMessage.ByteSize());
agentMessage.SerializeToCodedStream(coded_output);
delete coded_output;
delete raw_output;
boost::system::error_code ignored_error;
boost::asio::async_write(socket, b.data(), boost::bind(
&MessageService::handle_write, this,
boost::asio::placeholders::error));
Как вы можете видеть, я пишу WriteVarint32
длину сообщения, поэтому Java-сторона должна знать, используя parseDelimitedFrom
, как далеко она должна читать:
AgentMessage agentMessage = AgentMessageProtos.AgentMessage
.parseDelimitedFrom(socket.getInputStream());
Но это не поможет, я продолжаю получать такие исключения:
Protocol message contained an invalid tag (zero).
Message missing required fields: ...
Protocol message tag had invalid wire type.
Protocol message end-group tag did not match expected tag.
While parsing a protocol message, the input ended unexpectedly in the middle of a field. This could mean either than the input has been truncated or that an embedded message misreported its own length.
важно знать, что эти исключения не появляются в каждом сообщении. Это лишь малая часть сообщений, которые я получаю больше всего, просто отлично, но все же я бы хотел это исправить, так как я не хочу опускать сообщения.
Буду очень признателен, если кто-нибудь сможет мне помочь или потратит свои идеи.
Другим интересным фактом является количество сообщений, которые я получаю. Общее количество сообщений 1.000 за 2 секунды обычно для моей программы. Через 20 секунд около 100.000 и так далее. Я сократил количество сообщений, отправляемых искусственно, и когда передается только 6-8 сообщений, ошибок нет вообще. Так может ли это быть проблемой буферизации на стороне сокета Java-клиента?
Например, 60 000 сообщений, в среднем 5 из них повреждены.