Использование тестового кодека класса EmbeddedChannel: вызов метода writeOutbound () и вызов readOutbound () - PullRequest
0 голосов
/ 11 апреля 2019

Когда я использую класс 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());

}
...