摘要:一種特殊的實(shí)現(xiàn),它是專門(mén)為改進(jìn)針對(duì)的單元測(cè)試而提供的。名稱職責(zé)將入站消息寫(xiě)到中。如果沒(méi)有任何可供讀取的,則返回將標(biāo)記為完成,如果有可讀取的入站或出站數(shù)據(jù),則返回。這個(gè)方法還將會(huì)調(diào)用上的方法測(cè)試入站消息測(cè)試出站消息測(cè)試異常處理
一種特殊的Channel實(shí)現(xiàn)----EmbeddedChannel,它是Netty專門(mén)為改進(jìn)針對(duì)ChannelHandler的單元測(cè)試而提供的。
名稱 | 職責(zé) |
---|---|
writeInbound | 將入站消息寫(xiě)到EmbeddedChannel中。如果可以通過(guò)readInbound方法從EmbeddedChannel中讀取數(shù)據(jù),則返回true |
readInbound | 從EmbeddedChannel中讀取入站消息。任何返回東西都經(jīng)過(guò)整個(gè)ChannelPipeline。如果沒(méi)有任何可供讀取的,則返回null |
writeOutbound | 將出站消息寫(xiě)到EmbeddedChannel中,如果現(xiàn)在可以通過(guò)readOutbound從EmbeddedChannel中讀取到東西,則返回true |
readOutbound | 從EmbeddedChannel中讀取出站消息。任何返回東西都經(jīng)過(guò)整個(gè)ChannelPipeline。如果沒(méi)有任何可供讀取的,則返回null |
finish | 將EmbeddedChannel標(biāo)記為完成,如果有可讀取的入站或出站數(shù)據(jù),則返回true。這個(gè)方法還將會(huì)調(diào)用EmbeddedChannel上的close方法 |
public class FixedLengthFrameDecoder extends ByteToMessageDecoder { private final int frameLength; public FixedLengthFrameDecoder(int frameLength) { if (frameLength <= 0) { throw new IllegalArgumentException("frameLength must be positive integer: " + frameLength); } this.frameLength = frameLength; } @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List
public class FixedLengthFrameDecoderTest { @Test public void testFramesDecoded() { ByteBuf buf = Unpooled.buffer(); for (int i = 0; i < 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 < 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(); } }測(cè)試出站消息
public class AbsIntegerEncoder extends MessageToMessageEncoder{ @Override protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List
public class AbsIntegerEncoderTest { @Test public void testEncoded() { ByteBuf buf = Unpooled.buffer(); for (int i = 0; i < 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 < 10; i++) { Assert.assertEquals(Integer.valueOf(i), channel.readOutbound()); } Assert.assertNull(channel.readOutbound()); } }測(cè)試異常處理
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
public class FrameChunkDecoderTest { @Test public void testFramesDecoded() { ByteBuf buf = Unpooled.buffer(); for (int i = 0; i < 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(); } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/75743.html
摘要:支持很多協(xié)議,并且提供用于數(shù)據(jù)處理的容器。我們已經(jīng)知道由特定事件觸發(fā)。可專用于幾乎所有的動(dòng)作,包括將一個(gè)對(duì)象轉(zhuǎn)為字節(jié)或相反,執(zhí)行過(guò)程中拋出的異常處理。提供了一個(gè)容器給鏈并提供了一個(gè)用于管理沿著鏈入站和出站事件的流動(dòng)。子類通過(guò)進(jìn)行注冊(cè)。 前兩天寫(xiě)了一點(diǎn)netty相關(guān)的知識(shí),并寫(xiě)了一個(gè)demo,但是對(duì)其原理還是沒(méi)有深入,今天我們來(lái)做一次研究吧 首先讓我們來(lái)認(rèn)識(shí)一下netty的幾個(gè)核心人物吧...
摘要:可以用來(lái)接收入站事件和數(shù)據(jù),隨后使用應(yīng)用程序的業(yè)務(wù)邏輯進(jìn)行處理。因?yàn)橛脩舨⒉皇顷P(guān)心所有的事件,因此提供了抽象類和。抽象類最常見(jiàn)的一個(gè)情況,你的應(yīng)用程序會(huì)利用一個(gè)來(lái)接受解碼消息,并對(duì)該數(shù)據(jù)應(yīng)用業(yè)務(wù)邏輯。 Channel、EventLoop和ChannelFuture Channel——Socket; EventLoop——控制流、多線程處理、并發(fā) ChannelFuture異步通知 ...
摘要:轉(zhuǎn)發(fā)自 轉(zhuǎn)發(fā)自 http://netty.io/wiki/referenc... Since Netty version 4, the life cycle of certain objects are managed by their reference counts, so that Netty can return them (or their shared resources)...
摘要:只有在詳盡的測(cè)試之后才應(yīng)設(shè)置為這值使用的默認(rèn)采樣率檢測(cè)并報(bào)告任何發(fā)現(xiàn)的泄漏。這是默認(rèn)級(jí)別,適合絕大部分情況使用默認(rèn)的采樣率,報(bào)告所發(fā)現(xiàn)的任何的泄漏以及對(duì)應(yīng)的消息被訪問(wèn)的位置類似于但是其將會(huì)對(duì)每次對(duì)消息的訪問(wèn)都進(jìn)行采樣。 ChannelHandler Channel生命周期 狀態(tài) 描述 ChannelUnregistered Channel已經(jīng)被創(chuàng)建,但未注冊(cè)到EventLoo...
摘要:服務(wù)器構(gòu)成至少一個(gè)該組件實(shí)現(xiàn)了服務(wù)器對(duì)從客戶端接受的數(shù)據(jù)的處理,即它的業(yè)務(wù)邏輯引導(dǎo)配置服務(wù)器的啟動(dòng)代碼。至少,它會(huì)將服務(wù)器綁定到它要監(jiān)聽(tīng)連接請(qǐng)求的端口上。需要注意的是,由服務(wù)器發(fā)送的消息可能會(huì)被分塊接受。 Netty服務(wù)器構(gòu)成 至少一個(gè)ChannelHandler——該組件實(shí)現(xiàn)了服務(wù)器對(duì)從客戶端接受的數(shù)據(jù)的處理,即它的業(yè)務(wù)邏輯 引導(dǎo)——配置服務(wù)器的啟動(dòng)代碼。至少,它會(huì)將服務(wù)器綁定...
閱讀 3036·2023-04-25 18:06
閱讀 3294·2021-11-22 09:34
閱讀 2866·2021-08-12 13:30
閱讀 2055·2019-08-30 15:44
閱讀 1668·2019-08-30 13:09
閱讀 1636·2019-08-30 12:45
閱讀 1722·2019-08-29 11:13
閱讀 3616·2019-08-28 17:51