2015-10-05 34 views
1

我試圖從java服務器應用程序發送文件到java客戶端應用程序。 該文件似乎是從服務器發送到客戶端,因爲我得到的輸出是這樣的:Netty:ChannelRead0從未被調用

... 
Transfer progress: 8459452 
Transfer progress: 8459452/8459452 
Transfer complete. 

這個問題似乎是在客戶端。每個由服務器發送的塊都會調用。但channelRead0永遠不會被調用!即使從基類(它不會覆蓋在我的處理程序中)中也不會調用channelRead。任何想法我的代碼有什麼問題?提前致謝!

客戶端管道:

ChannelPipeline p = ch.pipeline(); 
p.addLast("Encoder", new ObjectEncoder()); 
p.addLast("Decoder", new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null))); 
p.addLast("chunkedWriteHandler", new ChunkedWriteHandler()); 
p.addLast("FileChunkHandler", new FileChunkHandler()); 

服務器管道:

p.addLast("Encoder", new ObjectEncoder()); 
p.addLast("Decoder", new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null))); 
p.addLast("chunkedWriteHandler", new ChunkedWriteHandler()); 
p.addLast("FileSenderHandler", new FileSenderHandler()); 

的FileChunkHandler在客戶端:

public class FileChunkHandler extends SimpleChannelInboundHandler<ChunkedFile>{ 
    @Override protected void channelRead0(ChannelHandlerContext ctx, ChunkedFile msg) throws Exception{ 
     System.out.println("channelRead0 ++++"); 
    } 

    @Override public void channelReadComplete(ChannelHandlerContext ctx) throws Exception{ 
     System.out.println("channelReadComplete ++++"); 
     ctx.fireChannelReadComplete(); 
    } 
} 

的FileSenderHandler在服務器上:

公共類FileSenderHandler擴展ChannelInboundHandlerAdapter {

@Override public void channelRegistered(ChannelHandlerContext ctx) throws Exception{ 
    File file = new File("/Users/kathrinjennifer/Documents/tmp/test/test.mp3"); 

    RandomAccessFile raf = null; 
    long fileLength = 0; 

    try { 
     raf = new RandomAccessFile(file, "r"); 
    } catch(IOException e){ 
     e.printStackTrace(); 
    } 

    ChannelFuture sendFileFuture = null; 

    ChunkedFile chunkedFile = new ChunkedFile(raf); 
    sendFileFuture = ctx.write(chunkedFile, ctx.newProgressivePromise()); 
    ctx.flush(); 

    sendFileFuture.addListener(new ChannelProgressiveFutureListener() { 

     @Override 
     public void operationProgressed(ChannelProgressiveFuture future, long progress, long total) { 
      if (total < 0) { // total unknown 
       System.err.println(future.channel() + " Transfer progress: " + progress); 
      } else { 
       System.err.println(future.channel() + " Transfer progress: " + progress + "/" + total); 
      } 
     } 

     @Override 
     public void operationComplete(ChannelProgressiveFuture future) { 
      System.err.println(future.channel() + " Transfer complete."); 
     } 
    }); 

    ctx.fireChannelRegistered(); 
} 

回答

1

你應該使用SimpleChannelInboundHandler<ByteBuf>,你將收到字節。

+0

不幸的是,這不起作用...我的渠道管道有什麼問題嗎? – KayJ

+0

ObjectDecoder似乎有影響力!如果它被註釋掉,channelRead0被調用。如果'FileChunkHandler'移動到流水線中的第一個處理程序'channelRead0''被讀取3次(而不是1,如果ObjectDecoder被註釋掉並且訂單被保留) – KayJ