Netty 4 - 具有多字节分隔符的ByteToMessageDecoder

时间:2013-12-05 06:24:12

标签: netty

在我的Netty 3.x FrameDecoder实现中,我使用ChannelBufferIndexFinder来帮助我找到FIX(http://www.fixtradingcommunity.org)消息之间的分隔符。分隔符定义为一系列字符。为了找到分隔符,我正在使用ChannelBuffer.indexOf()方法和ChannelBufferIndexFinder的实现。

ChannelBufferIndexFinder传入ChannelBuffer,因此我能够检查缓冲区中的其他字节是否有分隔符。

使用Netty 4.x,ByteBuf.indexOf()只允许我搜索单个字节。另外,还有ByteBuf.forEachByte(ByteBufProcessor),但ByteBufProcessor再次只允许我访问单个字节。

有没有办法找到我的分隔符?我猜我现在唯一的解决办法是滚动我自己的跨越多个字节的ByteBuf.forEachByte()等效版本?像DelimiterBasedFrameDecoder.indexOf()那样的东西?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将io.netty.handler.codec.DelimiterBasedFrameDecoder与包含该系列字符的io.netty.buffer.ByteBuf一起使用。

<强> DEPRECATED

您可以使用自己的io.netty.buffer.ByteBufIndexFinder实现与

类似的内容
@Override
public boolean find(final ByteBuf buffer, final int index) {
    boolean found;

    if (validateIndex(buffer, index)
            && sufficentBytesReadable(buffer, index)) {
        final byte byte0 = buffer.getByte(index);
        final byte byte1 = buffer.getByte(index + 1);
        found = byte0 == '\r' && byte1 == '\n';
    } else {
        found = false;
    }

    return found;
}
private boolean sufficentBytesReadable(final ByteBuf buffer,
        final int index) {
    return buffer.writerIndex() - index >= 2;
}
private boolean validateIndex(final ByteBuf buffer, final int index) {
    return index >= buffer.readerIndex() && index <= buffer.writerIndex();
}