2013-06-02 2 views
5

Я пытаюсь разобрать несколько сообщений буфера протокола в Java, которые генерируются в vb.netProtobuf C# для Java десериализация несколько сообщений

Я использую отличную Protobuf-сеть для потоковой передачи несколько сообщений на Java как на ниже:

ProtoBuf.Serializer.SerializeWithLengthPrefix(Of Msg)(postStream, msg, 
     ProtoBuf.PrefixStyle.Base128) 

в Java, я использую следующий код для разбора сообщений

final byte[] buffer = new byte[4096]; 
for (int c = ins.read(buffer); c >= 0; c = ins.read(buffer)) { 
    Msg msg = Msg.parseDelimitedFrom(new ByteArrayInputStream(buffer)); 
} 

Проблема в том, после того, как первое сообщение обрабатывается, он выдает ошибку синтаксического анализа себе cond со следующей погрешностью:

com.google.protobuf.InvalidProtocolBufferException: 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.

Если размер буфера и размер сообщения одинаковы? Если да, то как его разобрать, особенно для больших сообщений.

+0

Удаление '[C#]' и '[vb.net]', поскольку ответ, похоже, не нуждается в ссылке на любой из них. –

+0

Привет, У меня очень похожая проблема, вы могли бы подробнее остановиться на своем решении. У меня есть C# файл, который анализирует файл, содержащий много прото сообщений и он использует тот же код, который вы вставили ProtoBuf.Serializer.SerializeWithLengthPrefix (Of Msg) (postStream, сообщ, ProtoBuf.PrefixStyle.Base128) –

ответ

2

Проблема в том, что вам нужно читать непосредственно из исходного потока, а не по блоку за раз. (Даже если вы знаете, каждое сообщение ровно 4096 байт, вы не можете быть уверены, чтобы прочитать, что много сразу) я предлагаю вам использовать

while(stream still open) { 
    Msg msg = Msg.parseDelimitedFrom(ins); 
} 

Примечание: TCP является протоколом потоковой передачи, а не протокол обмена сообщениями. Вам гарантировано только чтение одного байта за раз, и любые дополнительные байты, которые вы получаете, являются бонусом.

+0

Проблема, если я я отправляю n сообщений в потоке httpwebrequest, как мне выполнить входной поток в java для получения n сообщений. – gaurav46

+0

@ gaurav46 Положить его в петлю? –

+0

@PeterLawery Хм ... Я бы подумал, что :). Благодарю. Позвольте мне попробовать. – gaurav46

Смежные вопросы