2013-06-02 23 views
5

Sto cercando di analizzare più messaggi di buffer protocollo in java che vengono generati in vb.netProtobuf C# a Java deserializzazione più messaggi

Sto usando l'eccellente protobuf-net per lo streaming di messaggi multipli a Java come sotto:

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

In Java, io sto usando il codice seguente per analizzare i messaggi

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

problema è dopo il primo messaggio viene analizzato, si genera un errore per l'analisi di se cond time con il seguente errore:

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.

Le dimensioni del buffer e le dimensioni del messaggio devono essere uguali? Se sì, allora come dovrei analizzarlo, specialmente per i messaggi di grandi dimensioni.

+0

Rimuovere '[C#]' e '[vb.net]' poiché la risposta non sembra aver bisogno di riferirsi a nessuno di questi. –

+0

Ciao, ho un problema molto simile potresti approfondire la tua soluzione. Ho file C# che analizza un file che contiene molti messaggi proto e utilizza lo stesso codice incollato ProtoBuf.Serializer.SerializeWithLengthPrefix (MSG) (postStream, msg, ProtoBuf.PrefixStyle.Base128) –

risposta

2

Il problema è che è necessario leggere direttamente dal flusso originale, non un blocco alla volta. (Anche se sai ogni messaggio è esattamente 4096 byte, non si può essere sicuri di leggere più di tanto in una sola volta) vi suggerisco di utilizzare

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

Nota: TCP è un protocollo di streaming, non un messaggio di protocollo. Hai solo la garanzia di leggere un byte alla volta, e ogni byte extra che ottieni è un bonus.

+0

Il problema è se io sto inviando n messaggi in un flusso httpwebrequest, come faccio ad eseguire il loop di inputstream in java per ottenere n messaggi. – gaurav46

+0

@ gaurav46 Inseriscilo in un ciclo? –

+0

@PeterLawery Hmm ... avrei dovuto pensarlo :). Grazie. Fammi provare. – gaurav46