温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

netty中EmbeddedChannel如何使用

发布时间:2021-08-12 16:27:18 来源:亿速云 阅读:186 作者:Leah 栏目:大数据

这篇文章给大家介绍netty中EmbeddedChannel如何使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

一种特殊的Channel实现----EmbeddedChannel,它是Netty专门为改进针对ChannelHandler的单元测试而提供的。

名称职责
writeInbound将入站消息写到EmbeddedChannel中。如果可以通过readInbound方法从EmbeddedChannel中读取数据,则返回true
readInbound从EmbeddedChannel中读取入站消息。任何返回东西都经过整个ChannelPipeline。如果没有任何可供读取的,则返回null
writeOutbound将出站消息写到EmbeddedChannel中,如果现在可以通过readOutbound从EmbeddedChannel中读取到东西,则返回true
readOutbound从EmbeddedChannel中读取出站消息。任何返回东西都经过整个ChannelPipeline。如果没有任何可供读取的,则返回null
finish将EmbeddedChannel标记为完成,如果有可读取的入站或出站数据,则返回true。这个方法还将会调用EmbeddedChannel上的close方法

测试入站消息

public class FixedLengthFrameDecoder extends ByteToMessageDecoder {     private final int frameLength;     public FixedLengthFrameDecoder(int frameLength) {         if (frameLength &lt;= 0) {             throw new IllegalArgumentException("frameLength must be positive integer: " + frameLength);         }         this.frameLength = frameLength;     }     @Override     protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<object> out) throws Exception {         while (in.readableBytes() &gt;= frameLength) {             ByteBuf buf = in.readBytes(frameLength);             out.add(buf);         }     } }
public class FixedLengthFrameDecoderTest {     @Test     public void testFramesDecoded() {         ByteBuf buf = Unpooled.buffer();         for (int i = 0; i &lt; 9; i++) {             buf.writeByte(i);         }         ByteBuf input = buf.duplicate();         EmbeddedChannel channel = new EmbeddedChannel(new FixedLengthFrameDecoder(3));         Assert.assertTrue(channel.writeInbound(input.retain()));         Assert.assertTrue(channel.finish());         ByteBuf read = channel.readInbound();         Assert.assertEquals(buf.readSlice(3), read);         read.release();         read = channel.readInbound();         Assert.assertEquals(buf.readSlice(3), read);         read.release();         read = channel.readInbound();         Assert.assertEquals(buf.readSlice(3), read);         read.release();         Assert.assertNull(channel.readInbound());         buf.release();     }     @Test     public void testFramesDecoded2() {         ByteBuf buf = Unpooled.buffer();         for (int i = 0; i &lt; 9; i++) {             buf.writeByte(i);         }         ByteBuf input = buf.duplicate();         EmbeddedChannel channel = new EmbeddedChannel(new FixedLengthFrameDecoder(3));         Assert.assertFalse(channel.writeInbound(input.readBytes(2)));         Assert.assertTrue(channel.writeInbound(input.readBytes(7)));         Assert.assertTrue(channel.finish());         ByteBuf read = channel.readInbound();         Assert.assertEquals(buf.readSlice(3), read);         read.release();         read = channel.readInbound();         Assert.assertEquals(buf.readSlice(3), read);         read.release();         read = channel.readInbound();         Assert.assertEquals(buf.readSlice(3), read);         read.release();         Assert.assertNull(channel.readInbound());         buf.release();     } }

测试出站消息

public class AbsIntegerEncoder extends MessageToMessageEncoder<bytebuf> {     @Override     protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<object> out) throws Exception {         while (in.readableBytes() &gt;= 4) {             int value = Math.abs(in.readInt());             out.add(value);         }     } }
public class AbsIntegerEncoderTest {     @Test     public void testEncoded() {         ByteBuf buf = Unpooled.buffer();         for (int i = 0; i &lt; 10; i++) {             buf.writeInt(i * -1);         }         EmbeddedChannel channel = new EmbeddedChannel(new AbsIntegerEncoder());         Assert.assertTrue(channel.writeOutbound(buf));         Assert.assertTrue(channel.finish());         for (int i = 0; i &lt; 10; i++) {             Assert.assertEquals(Integer.valueOf(i), channel.readOutbound());         }         Assert.assertNull(channel.readOutbound());     } }

测试异常处理

public class FrameChunkDecoder extends ByteToMessageDecoder {     private final int maxFrameSize;     public FrameChunkDecoder(int maxFrameSize) {         this.maxFrameSize = maxFrameSize;     }     @Override     protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<object> out) throws Exception {         int readableBytes = in.readableBytes();         if (readableBytes &gt; maxFrameSize) {             in.clear();             throw new TooLongFrameException();         }         ByteBuf buf = in.readBytes(readableBytes);         out.add(buf);     } }
public class FrameChunkDecoderTest {     @Test     public void testFramesDecoded() {         ByteBuf buf = Unpooled.buffer();         for (int i = 0; i &lt; 9; i++) {             buf.writeByte(i);         }         ByteBuf input = buf.duplicate();         EmbeddedChannel channel = new EmbeddedChannel(new FrameChunkDecoder(3));         Assert.assertTrue(channel.writeInbound(input.readBytes(2)));         try {             channel.writeInbound(input.readBytes(4));             Assert.fail();         } catch (TooLongFrameException e) {         }         Assert.assertTrue(channel.writeInbound(input.readBytes(3)));         Assert.assertTrue(channel.finish());         ByteBuf read = channel.readInbound();         Assert.assertEquals(buf.readSlice(2), read);         read.release();         read = channel.readInbound();         Assert.assertEquals(buf.skipBytes(4).readSlice(3), read);         read.release();         buf.release();     } }

关于netty中EmbeddedChannel如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI