Я реализовал серверное приложение, которое считывает входящие байты с помощью ChannelInblundHandlerAdapter, используя структуру netty.
Моя проблема, как показано в заголовке, заключается в том, что я нерегулярно получаю контент от клиента, который, как мне кажется, обрезается после ~ 1.500 байт. Например: в таком случае я должен получить большой массив JSON. Поскольку он разрезан, я не могу его разобрать.
Я попытался декодировать сообщение с помощью дополнительного канала ByteToMessageDecoder в конвейере перед его использованием. Но это не решает проблему. У меня нет разделителя в JSON, который я мог бы проверить и снова склеить две (или более) части.
Вот моя конфигурация конвейера:
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) {
ch.pipeline().addLast(new IdleStateHandler(45,0,0));
ch.pipeline().addLast(new MyByteToMessageDecoder());
ch.pipeline().addLast(new GatewayCommunicationHandler());
}
})
.option(ChannelOption.SO_BACKLOG, 128)
.option(ChannelOption.SO_RCVBUF, 8192)
.childOption(ChannelOption.RCVBUF_ALLOCATOR, new FixedRecvByteBufAllocator(8192))
.childOption(ChannelOption.SO_KEEPALIVE, true);
initRestServer();
// Bind and start to accept incoming connections.
ChannelFuture f = b.bind(Config.gatewayPort).sync();
f.channel().closeFuture().sync();
И это мой ByteToMessageDecoder: (я знаю, что это беспорядок, но я понятия не имел, как с этим справиться в моем случае)
public class MyByteToMessageDecoder extends ByteToMessageDecoder {
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) {
byte[] receivedBytes = new byte[in.readableBytes()];
in.getBytes(in.readerIndex(), receivedBytes);
if (receivedBytes[in.readableBytes()-1] != (byte) 0) {
out.add(receivedBytes);
return;
}
int lenForOutBytes = 0;
for (Object o : out) {
byte[] bytes = (byte[]) o;
lenForOutBytes += bytes.length;
}
byte[] outBytes = new byte[lenForOutBytes];
for (Object o : out) {
byte[] bytes = (byte[]) o;
if (out.size() == 1) {
outBytes = (byte[]) out.get(0);
}
else {
int i = 0;
for (int j = 0; j < bytes.length; j++) {
outBytes[i + j] = bytes[j];
}
i += bytes.length;
}
}
ctx.fireChannelRead(outBytes);
in.resetReaderIndex();
}
...
У кого-нибудь еще есть такая проблема.
Спасибо за ваши ответы
Бр Джо



