2013-06-02 8 views
5

Próbuję analizować wiele wiadomości buforowe protokół w języku Java, które są generowane w VB.NETProtobuf C# Java deserializacji wielu wiadomości

używam doskonałą protobuf netto do przesyłania wielu wiadomości do Javy, jak na poniżej:

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

W Javie Używam następujący kod do analizowania wiadomości

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)); 
} 

problem polega po pierwsze wiadomość jest analizowany, zgłasza błąd do analizowania se czas zwłoki z następującym błędem:

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.

Czy rozmiar bufora i rozmiar wiadomości są takie same? Jeśli tak, to jak mam je przeanalizować, zwłaszcza w przypadku dużych wiadomości.

+0

Usunięcie '[C#]' i '[vb.net]' jako odpowiedzi nie wydaje się wymagać odniesienia się do żadnego z nich. –

+0

Witam, mam bardzo podobny problem, mógłbyś dalej rozwinąć swoje rozwiązanie. Mam plik C#, który analizuje plik zawierający wiele wiadomości proto i wykorzystuje ten sam kod wklejony ProtoBuf.Serializer.SerializeWithLengthPrefix (MSG) (postStream, MSG, ProtoBuf.PrefixStyle.Base128) –

Odpowiedz

2

Problem polega na tym, że należy czytać bezpośrednio z oryginalnego strumienia, a nie z bloku na raz. (Nawet jeśli wiesz, każda wiadomość jest dokładnie 4096 bajty, nie może być pewien, że dużo czytać na raz) Proponuję użyć

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

Uwaga: TCP to protokół przesyłania strumieniowego, a nie protokół wiadomość. Masz tylko jeden bajt na raz, a wszystkie dodatkowe bajty, które otrzymujesz, są bonusem.

+0

Problem jest, jeśli ja wysyłam n wiadomości w strumieniu httpwebrequest, w jaki sposób mogę pętli inputstream w java, aby uzyskać n wiadomości. – gaurav46

+0

@ gaurav46 Umieścić go w pętli? –

+0

@PeterLawery Hmm ... Powinienem był pomyśleć :). dzięki. Daj mi spróbować. – gaurav46

Powiązane problemy