Когда я использую класс EmbeddedChannel
для проверки правильности LengthFieldBasedFrameDecoder
и LengthFieldPrepender
в пользовательском протоколе с ProtoBuf
, Я ожидаю получить все данные в кодировке.Во-первых, я вызываю метод ch.writeOutbound()
, чтобы добавить свой объект сообщения.Во-вторых, я вызываю метод ch.readOutbound()
, чтобы получить ByteBuf.Я ожидаю получить ByteBuf, который объединяет поле длины ByteBuf и сообщение ByteBuf.Но я получаю только ByteBuf, обертывающий поле длины, которое равно PooledUnsafeDirectByteBuf(ridx: 0, widx: 4, cap: 4)
.Это смущает меня.Затем я отлаживаю программу.Я могу понять принцип опроса от outmessage
.Итак, я получаю поле длины ByteBuf в первую очередь.Почему проектирование таким образом?Могу ли я получить все данные в кодировке.Ниже приведен мой тестовый код.
@test
public void testAlarmProto(){
AlarmProto.Alarm.Builder builder = AlarmProto.Alarm.newBuilder();
builder.setCommunity("Quene Home");
builder.setBuildingId(31);
builder.setBuildingPart("B");
builder.setCellId(1);
builder.setRoomId(204);
builder.setAlarmCategory("Fire");
builder.setAttachment("Current time");
MessageProto.MessageBase.Body.Builder body = MessageProto.MessageBase.Body.newBuilder();
body.setContext(builder.build());
MessageProto.MessageBase.Header.Builder header =MessageProto.MessageBase.Header.newBuilder();
header.setType(MessageProto.MessageBase.MessageType.SERVICE_REQ);
MessageProto.MessageBase.Builder message = MessageProto.MessageBase.newBuilder();
message.setHeader(header.build());
message.setBody(body.build());
//create EmbeddedChannel
EmbeddedChannel ch = new EmbeddedChannel();
ch.pipeline().addLast("frameDecoder",new LengthFieldBasedFrameDecoder(1048576,0,4,0,4));
// ch.pipeline().addLast("frameDecoder",new ProtobufVarint32FrameDecoder());
ch.pipeline().addLast("decoder",new ProtobufDecoder(MessageProto.MessageBase.getDefaultInstance()));
ch.pipeline().addLast("frameEncoder",new LengthFieldPrepender(4));
// ch.pipeline().addLast("frameEncoder",new ProtobufVarint32LengthFieldPrepender());
ch.pipeline().addLast("encoder",new ProtobufEncoder());
//write outbound data to ch
ch.writeOutbound(message.build());
//get data from ch but only the
ByteBuf byteBuf = ch.readOutbound();
ch.writeInbound(byteBuf);
ch.finish();
MessageProto.MessageBase messageBase = ch.readInbound();
System.out.println(messageBase.getHeader().getType().getNumber());
System.out.println(messageBase.getBody().getContext().getBuildingPart());
}