2013-06-02 26 views
5

Tôi cố gắng để phân tích nhiều thông điệp giao thức đệm trong java được tạo ra trong vb.netProtobuf C# để java deserializing nhiều thông điệp

Tôi đang sử dụng tuyệt vời protobuf-net stream nhiều tin nhắn cho java theo dưới đây:

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

Trong Java, tôi đang sử dụng đoạn mã sau để phân tích các thông điệp

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

vấn đề là sau khi thông điệp đầu tiên được phân tách, nó throws lỗi cho phân tích cú pháp se thời gian có lỗi sau:

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.

Kích thước bộ đệm và kích cỡ thư có giống nhau không? Nếu có, thì làm thế nào tôi nên phân tích nó, đặc biệt là cho các tin nhắn lớn.

+0

Xoá '[C#]' và '[vb.net]' làm câu trả lời dường như không cần tham chiếu đến một trong hai cách này. –

+0

Xin chào, tôi có một vấn đề rất giống với bạn có thể giải thích thêm về giải pháp của bạn. Tôi có C tập tin # mà phân tích một tập tin có chứa nhiều thông điệp proto và nó sử dụng cùng một mã bạn dán ProtoBuf.Serializer.SerializeWithLengthPrefix (Tất Msg) (postStream, msg, ProtoBuf.PrefixStyle.Base128) –

Trả lời

2

Vấn đề là bạn cần phải đọc trực tiếp từ luồng gốc, chứ không phải từng khối tại một thời điểm. (Ngay cả khi bạn biết mọi thư là chính xác 4096 byte, bạn không thể chắc chắn đọc nhiều thư đó cùng một lúc) Tôi khuyên bạn nên sử dụng

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

Lưu ý: TCP là giao thức thư. Bạn chỉ được đảm bảo đọc một byte tại một thời điểm và bất kỳ byte thừa nào bạn nhận được đều là tiền thưởng.

+0

Vấn đề là nếu tôi đang gửi n thư trong luồng httpwebrequest, làm cách nào để tôi lặp dòng đầu vào trong java để nhận được thư n. – gaurav46

+0

@ gaurav46 Đặt nó trong một vòng lặp? –

+0

@PeterLawery Hmm ... Tôi nên nghĩ rằng :). cảm ơn. Hãy để tôi thử. – gaurav46