FrameDecoder を拡張する非常に単純なデコーダーがあります。
単純なテキスト プロトコル (常に可変長) をデコードし、'\r' が見つかるまでバッファーを読み取り、ChannelBuffer (1 つのデコードされたメッセージを含む) を返します。
テキスト プロトコル/メッセージの例:
xxxx,yyyy,zzzz\r
私は常にデコーダーを次のように stringdecoder と組み合わせます。
p.addLast("stdDecoder", new SimpleTextDecoder()); //extends FrameDecoder
p.addLast("stringDecoder", new StringDecoder(CharsetUtil.UTF_8));
より高い tps (+/- 200tps) に達するまで、すべて問題ありません。ChannelBuffer は散発的に次のようなバッファーを返し始めます。
>xxxx,yyyxxxx,yyyy,zzzz\r
または:
>y、zzzz\r など。
デコーダー:
public static final char END_MESSAGE = 13;
if (buffer.readableBytes() < 6) {
return null;
}
buffer.markReaderIndex();
if (1 <= buffer.readableBytes()) {
byte bite = buffer.readByte();
if (bite != END_MESSAGE) {
/* Create a new ChannelBuffer which is used for the cumulation. */
ChannelBuffer frameBuffer = buffer.factory().getBuffer(buffer.capacity());
/* Write byte */
frameBuffer.writeByte(bite);
while (buffer.readable()) {
/* read next byte */
bite = buffer.readByte();
if (bite != END_MESSAGE) {
frameBuffer.writeByte(bite);
} else {
/* Write end message and return buffer */
frameBuffer.writeByte(bite);
return frameBuffer;
}
}
} else {
return null;
}
}
/* not readable bytes return null*/
return null;
}
編集:わかりました新しいバージョン、現在動作中..可能であれば、これに関するフィードバックをお願いします:)
public class xxxxDecoder extends FrameDecoder {
private static final Logger log = LoggerFactory.getLogger(xxxxDecoder.class);
public static final char END_MESSAGE = 13;
public static final char START_MESSAGE = 83;
//Decodes the received packets so far into a frame.
@Override
protected Object decode(ChannelHandlerContext ctx,
Channel channel,
ChannelBuffer buffer) throws Exception {
/* Shortest known xxx message\r
* 8 bytes
*/
if (buffer.readableBytes() < 8) {
if (Consts.DEBUG_ENABLED) {
log.debug("YAWN... data Smaller than 8 bytes,waiting for more," + buffer.readableBytes());
}
/*If null is returned, it means there's not enough data yet.*/
buffer.resetReaderIndex();
return null;
} else {
log.debug("Readable bytes=" + buffer.readableBytes() + ",buffersize=" + buffer.capacity());
}
/* Mark the "end, i think?" of this buffer */
buffer.markReaderIndex();
if (1 <= buffer.readableBytes()) {
byte bite = buffer.readByte();
if (bite != END_MESSAGE) {
if (Consts.DEBUG_ENABLED) {
log.debug("Yipee...Found new message," + bite + ",buffersize=" + buffer.capacity());
}
/* Create a new ChannelBuffer which is used for the cumulation. */
ChannelBuffer frameBuffer = buffer.factory().getBuffer(buffer.capacity());
/* Write byte */
frameBuffer.writeByte(bite);
while (buffer.readable()) {
/* read next byte */
bite = buffer.readByte();
if (bite != END_MESSAGE) {
frameBuffer.writeByte(bite);
} else {
/* Write end message and return buffer */
frameBuffer.writeByte(bite);
if (Consts.DEBUG_ENABLED) {
log.debug("Aha...Found end message=" + bite + ", returning complete message");
}
return frameBuffer;
}
}
} else {
/*If null is returned, it means there's not enough data yet.*/
buffer.resetReaderIndex();
return null;
}
}
/* not readable bytes return null*/
buffer.resetReaderIndex();
return null;
}