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();
}
不幸的是,這不起作用...我的渠道管道有什麼問題嗎? – KayJ
ObjectDecoder似乎有影響力!如果它被註釋掉,channelRead0被調用。如果'FileChunkHandler'移動到流水線中的第一個處理程序'channelRead0''被讀取3次(而不是1,如果ObjectDecoder被註釋掉並且訂單被保留) – KayJ