netty:如何从客户端获取完整的消息

时间:2015-06-22 08:41:45

标签: client server response netty communication

我的代码在处理程序类

的服务器端就像这样
package nettyechoserver;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.ReferenceCountUtil;

/**
* Handler implementation for the echo server.
*/

@Sharable
public class EchoServerHandler extends ChannelHandlerAdapter {
int i = 0;
ByteBuf in = null;
byte[] inByteBuf=new byte[78231];
@Override
public void handlerAdded(ChannelHandlerContext ctx) {
    in = ctx.alloc().buffer(4); // (1)
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
   in = (ByteBuf) msg;
    try {
        while (in.isReadable()) { // (1)

            inByteBuf[i] = in.readByte();

            System.out.flush();
            i++;
        }
    } finally {
        ReferenceCountUtil.release(msg); // (2)
    }
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
    final ByteBuf time = ctx.alloc().buffer(4);
   System.out.println("total read: " + i);
   String s = "Message Received";
        time.writeBytes(s.getBytes());
        final ChannelFuture f = ctx.writeAndFlush(time); // (3)
        f.addListener(new ChannelFutureListener() {

            public void operationComplete(ChannelFuture future) {
                assert f == future;
                ctx.close();
            }
        });
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
    // Close the connection when an exception is raised.
    cause.printStackTrace();
    ctx.close();
}
}

现在的问题是我以字节形式发送76 kb数据,总接收数据大小为16 kb,每次只丢失其他数据 任何人都可以帮助我收到我的全部数据我在等你的答案

1 个答案:

答案 0 :(得分:1)

这里发生的是你收到第一个块(TCP / IP方式,在一个大框架中切割几个部分),但是你只处理第一个数据包,而不是以下(并且你应该只接收其他数据包)。

您应该使用一些符合您需求的解码器,一个解码器将信息包保存在数据包之后,直到您获得所有需要的信息传递给下一个处理器,这将是您的业务。

例如,您可以使用LengthFieldBasedFrameDecoder,或最简单的FixedLengthFrameDecoder