繁体   English   中英

Netty 4:如何手动调用处理程序?

[英]Netty 4: how to manually invoke handlers?

情况是: DelimiterBasedFrameDecoder extends ByteToMessageDecoder ,而ByteToMessageDecoder确实将未处理的字节保留在称为cumulationByteBuf 我想在另一个处理程序中手动调用此处理程序以清空此cumulation ByteBuf

我试过的

DelimiterBasedFrameDecoder frameDecoder = (DelimiterBasedFrameDecoder) inboundChannel.pipeline().get("frameDecoder");
frameDecoder.channelRead(ctx, Unpooled.EMPTY_BUFFER);

问题:我尝试的方法不起作用,因为没有下一个处理程序,因此Netty告诉我字节丢失了:

在流水线的末尾丢弃的入站消息UnpooledHeapByteBuf(ridx:0,widx:57,cap:57)。 请检查您的管道配置。

您可以将处理程序包装在EmbeddedChannel中,并使用writeInbound()和readInbound()。 查看我们的单元测试以获取用法示例以及javadocs。

诺曼(Norman)使我走上了正确的道路,但这是我需要做的事情:

PublicCumulationDelimiterBasedFrameDecoder frameDecoder = (PublicCumulationDelimiterBasedFrameDecoder) cp.get("frameDecoder");

ByteBuf bytesNotProcessed = frameDecoder.internalBuffer();

if (bytesNotProcessed != Unpooled.EMPTY_BUFFER) {                                   PublicCumulationDelimiterBasedFrameDecoder tmpDelimiterBasedFrameDecoder = new PublicCumulationDelimiterBasedFrameDecoder(2048, false, true, Unpooled.wrappedBuffer(new byte[] { 0x03 }));

    EmbeddedChannel ec = new EmbeddedChannel(tmpDelimiterBasedFrameDecoder, ... other handlers...);

    ByteBuf wrapper = Unpooled.buffer();
    wrapper.writeBytes(bytesNotProcessed);

    ec.writeInbound(wrapper);// make it process the bytes

    // put the remaining bytes (if any) back into the original buffer
    bytesNotProcessed.clear();
    bytesNotProcessed.writeBytes(tmpDelimiterBasedFrameDecoder.internalBuffer());
}

其中PublicCumulationDelimiterBasedFrameDecoder就是这样:

public class PublicCumulationDelimiterBasedFrameDecoder extends DelimiterBasedFrameDecoder {

    public PublicCumulationDelimiterBasedFrameDecoder(int maxFrameLength, boolean stripDelimiter, boolean failFast, ByteBuf delimiter) {
        super(maxFrameLength, stripDelimiter, failFast, delimiter);
    }

    public ByteBuf internalBuffer() {
        return super.internalBuffer();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM