отправка большой строки в сокет Apache Netty, но получает неполную строку на стороне клиента - PullRequest
0 голосов
/ 23 января 2020

Я посылаю строку с символом 2000 в сокет TCP по протоколу netty, как на стороне клиента, так и на сервере, я установил этот конвейер:

socketChannel.pipeline().addLast(
                        new StringEncoder(),
                        new StringDecoder(),
                        new LineBasedFrameDecoder(Integer.MAX_VALUE),
                        myHandler);

на стороне сервера, у меня есть ChannelInboundHandlerAdapter.

 @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
                     // some code
                     ctx.writeAndFlush(line);
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
    ctx.writeAndFlush(Unpooled.EMPTY_BUFFER)
            .addListener(ChannelFutureListener.CLOSE);
}

на стороне клиента У меня есть SimpleChannelInboundHandler. но я получаю свою строку неполной. Почему !? Как я могу решить это?

  protected void channelRead0(ChannelHandlerContext channelHandlerContext, Object msg) throws Exception {//msg is incomplete}

1 Ответ

0 голосов
/ 23 января 2020

Я нашел решение. Новый LineBasedFrameDecoder (Integer.MAX_VALUE) - нонсенс. потому что максимальное количество символов в каждой строке в java равно 65536, поэтому попробуйте новый LineBasedFrameDecoder (65536) или любой другой размер, который вам нужен. На стороне сервера каждое сообщение должно заканчиваться \ n или \ r \ n. так, например, если вы читаете строку из текстового файла, вам нужно добавить \ n в конце этого.

...