我的代码在处理程序类
的服务器端就像这样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,每次只丢失其他数据 任何人都可以帮助我收到我的全部数据我在等你的答案
答案 0 :(得分:1)
这里发生的是你收到第一个块(TCP / IP方式,在一个大框架中切割几个部分),但是你只处理第一个数据包,而不是以下(并且你应该只接收其他数据包)。
您应该使用一些符合您需求的解码器,一个解码器将信息包保存在数据包之后,直到您获得所有需要的信息传递给下一个处理器,这将是您的业务。
例如,您可以使用LengthFieldBasedFrameDecoder,或最简单的FixedLengthFrameDecoder。