Netty byte但是解码时不能得到大输入的完整消息



有一个遗留的应用程序在TCP上做json。

我使用netty服务器,我想通过Gson将json转换为Pojo。

为了做到这一点,我转换创建了一个Decoder,它将ByteBuf作为输入并创建My Object。

问题是Bytebuf的大小是1024,而json比这个大得多(>20mo)

@Sharable
public class RequestDecoder extends MessageToMessageDecoder<ByteBuf> {
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
        InputStream json = new ByteBufInputStream(msg);
        InputStreamReader inputStreamReader = new InputStreamReader(json, Charsets.UTF_8);
        JsonReader reader;
        reader = new JsonReader(inputStreamReader);
        reader.setLenient(true);
        Request object = new Gson().fromJson(reader, Request.class);
        try {
            reader.close();
        } catch (IOException e) {
            throw new RuntimeException("uncloseable reader", e);
        }
        out.add(object);
    }
}

我总是得到一个:

com.google.gson.stream.MalformedJsonException: Unterminated string at line 1 column 1020

,当我调试我只得到1024第一个字节的"ByteBuf msg"

如何设置ByteBuf容量为最大容量?(当调试时,我看到ByteBuf是一个maxCapacity为2147483647的SimpleLeakAwareByteBuf)

我怎样才能摆脱这个限制?

我在管道的开头添加了DelimiterBasedFrameDecoder:

pipeline.addLast("framer", new DelimiterBasedFrameDecoder(Integer.MAX_VALUE, Unpooled.wrappedBuffer(new byte[]{'E', 'O', 'F', 'n'})));

因为我发现所有json都以"EOFn"结尾(由于遗留问题)

现在对我来说没问题,但是当这个遗留问题解决后会发生什么?

尝试使用不同的解码器。例如,尝试ReplayingDecoder。

Netty中有许多可用的解码器。您必须选择最合适的解码器,并根据您的需求实现它。

当使用ReplayingDecoder时,请确保知道您想要准确读取多少字节。通常,要读取的字节大小是在网络数据包的开头发送的。

最新更新