2015-06-22 36 views
1
得到完整的信息

我的代码是这样的服务器端的处理程序类网状:如何从客户端

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

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

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

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