在我的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()那样的东西?
谢谢!
答案 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();
}