Nettyを使用していますが、キャリッジリターンを受信しない限り、ChannelPipelineのFrameDecoderは呼び出されないようです。たとえば、完全なJSON文字列が受信されたことを検出するために作成した次のデコーダーがあります。
public class JsonDecoder extends FrameDecoder {
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer buf) {
char inChar = 0;
ChannelBuffer origBuffer = buf.copy();
StringBuilder json = new StringBuilder();
int ctr = 0;
while(buf.readable()) {
inChar = (char) buf.readByte();
json.append(inChar);
if (inChar == '{') {
ctr++;
} else if (inChar == '}') {
ctr--;
}
}
if (json.length() > 0 && ctr == 0) {
return origBuffer;
}
buf.resetReaderIndex();
return null;
}
}
(ややずさんなコードはご容赦ください。これは、Nettyを使用した最初の試みであり、少しの学習経験があります。)
telnetを使用してサーバーに接続し、有効なJSONを貼り付けて、Returnキーを押してテストすると、これは正常に機能することがわかります。ただし、JSON文字列の最後の終了'}'の後でreturnキーを押さないと、デコーダーは更新されたバッファーで呼び出されません。
異なる動作をするようにチャネルパイプラインを構成する方法はありますか?私はこれをグーグルで検索し、Nettyのドキュメントを調べました。基本的なものが欠けているような気がして、正しい場所を探したり、正しいものを探したりしていません。助けてくれてありがとう。