在测试的处理器—AbsIntegerEncoder,它是 Netty 的 MessageToMessageEncoder 的一个特殊化的实现,用于将负值整数转换为绝对值。
该示例将会按照下列方式工作:
持有 AbsIntegerEncoder 的 EmbeddedChannel 将会以 4 字节的负整数的形式写出站数据;
编码器将从传入的 ByteBuf 中读取每个负整数,并将会调用 Math.abs()方法来获取其绝对值;
编码器将会把每个负整数的绝对值写到 ChannelPipeline 中。

AbsIntegerEncoderTest

  1. package cn.enjoyedu.nettybasic.embedded;
  2. import io.netty.buffer.ByteBuf;
  3. import io.netty.buffer.Unpooled;
  4. import io.netty.channel.embedded.EmbeddedChannel;
  5. import org.junit.Test;
  6. import static org.junit.Assert.*;
  7. /**
  8. * 作者:Mark/Maoke
  9. * 创建日期:2018/08/26
  10. * 类说明:测试出站处理,可以通过修改AbsIntegerEncoder看运行结果
  11. */
  12. public class AbsIntegerEncoderTest {
  13. @Test
  14. public void testEncoded() {
  15. //(1) 创建一个 ByteBuf,并且写入 9 个负整数
  16. ByteBuf buf = Unpooled.buffer();
  17. for (int i = 1; i < 10; i++) {
  18. buf.writeInt(i * -1);
  19. }
  20. //(2) 创建一个EmbeddedChannel,并安装一个要测试的 AbsIntegerEncoder
  21. EmbeddedChannel channel = new EmbeddedChannel(
  22. new AbsIntegerEncoder());
  23. //(3) 写入 ByteBuf,并断言调用 readOutbound()方法将会产生数据
  24. assertTrue(channel.writeOutbound(buf));
  25. //(4) 将该 Channel 标记为已完成状态
  26. assertTrue(channel.finish());
  27. // read bytes
  28. //(5) 读取所产生的消息,并断言它们包含了对应的绝对值
  29. for (int i = 1; i < 10; i++) {
  30. int x = channel.readOutbound();
  31. assertEquals(i, x);
  32. }
  33. assertNull(channel.readOutbound());
  34. }
  35. }

AbsIntegerEncoder

  1. package cn.enjoyedu.nettybasic.embedded;
  2. import io.netty.buffer.ByteBuf;
  3. import io.netty.channel.ChannelHandlerContext;
  4. import io.netty.handler.codec.MessageToMessageEncoder;
  5. import java.util.List;
  6. /**
  7. * AbsIntegerEncoder
  8. */
  9. //扩展 MessageToMessageEncoder 以将一个消息编码为另外一种格式
  10. public class AbsIntegerEncoder extends
  11. MessageToMessageEncoder<ByteBuf> {
  12. @Override
  13. protected void encode(ChannelHandlerContext channelHandlerContext,
  14. ByteBuf in, List<Object> out) throws Exception {
  15. //检查是否有足够的字节用来编码,int为4个字节
  16. while (in.readableBytes() >= 4) {
  17. //从输入的 ByteBuf中读取下一个整数,并且计算其绝对值
  18. int value = Math.abs(in.readInt());
  19. //将该整数写入到编码消息的 List 中
  20. out.add(value);
  21. }
  22. }
  23. }