我正在使用Netty,並且似乎不會調用ChannelPipeline中的FrameDecoder,除非/直到收到回車。例如,我有我寫嘗試檢測,當一個完整的JSON字符串已經收到了以下解碼器:Netty FrameDecoder在ChannelPipeline中沒有回車沒有被調用?
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然後按回車鍵連接到服務器上測試它工作正常。但是,如果我在JSON字符串中的最後一次關閉'}'之後沒有按回車,解碼器將不會被更新的緩衝區調用。
是否有配置通道管道的工作方式不同的方式?我已經爲此搜索並查看了Netty文檔。我覺得我錯過了一些基本的東西,我只是沒有找到正確的地方或尋找正確的東西。謝謝你的幫助。
此外,我應該提到,這只是通過TCP套接字連接傳遞的原始JSON - 不涉及HTTP協議。 – 2013-03-22 16:59:42