使用ChunkedWriteHandler的jboss netty上传文件处理程序

时间:2011-08-16 14:03:44

标签: netty

我正在使用ChunkedWriteHandler来处理ChunkedFile并进入下面的情况 如果我将ChunkedFile写入channelFuture Listener中的频道,

我得到了 java.nio.channels.ClosedChannelException&显示java.lang.NullPointerException

当我做clientChannel.write()

 InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", testPort);
 final ChannelFuture channelFuture =  clientBootstrap.connect(inetSocketAddress);

 channelFuture.addListener(
            new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {
                    System.out.println("connected!");

                    Channel clientChannel = channelFuture.getChannel();
                    ChannelFuture channelFuture2 = clientChannel.write( new ChunkedFile( new File("c:\\openjdk-7-fcs-src-b147-27_jun_2011.zip"))  );

                    channelFuture2.addListener(
                            new ChannelFutureListener() {
                                @Override
                                public void operationComplete(ChannelFuture future) throws Exception {
                                    System.out.println("finished uploading!");
                                }
                            }
                    );

                }
        }
    );

我知道做这项工作的唯一方法是: - 不要使用听众 - 并添加Thread.sleep(1000)

    InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", testPort);
    final ChannelFuture channelFuture =  clientBootstrap.connect(inetSocketAddress);

    Thread.sleep(1000);

    Channel clientChannel = channelFuture.getChannel();
    ChannelFuture channelFuture2 = clientChannel.write( new ChunkedFile( new File("k:\\soft\\openjdk-7-fcs-src-b147-27_jun_2011.zip"))  );

    channelFuture2.addListener(
            new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {
                    System.out.println("finished uploading!");
                }
            }
    );

我做错了什么?

完整代码(也在http://github.com/lydonchandra/netty/blob/master/src/test/java/org/jboss/netty/handler/stream/ChunkedWriteHandlerTest.java

            NioClientSocketChannelFactory channelFactory = new NioClientSocketChannelFactory(clientExecutor, Executors.newCachedThreadPool());
    ClientBootstrap clientBootstrap = new ClientBootstrap(channelFactory);
    clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() {

        @Override
        public ChannelPipeline getPipeline() throws Exception {
            return Channels.pipeline(
                    new SimpleChannelUpstreamHandler() {

                        @Override
                          public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
                                // Send the first message.  Server will not send anything here
                                // because the firstMessage's capacity is 0.
                                System.out.println("client - channel connected");
                          }

                        @Override
                        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
                            System.out.println("message received");
                        }

                        @Override
                              public void exceptionCaught(
                                      ChannelHandlerContext ctx, ExceptionEvent e) {
                                    // Close the connection when an exception is raised.
                                    System.out.println(e.getCause());
                                    e.getChannel().close();
                              }
                    },

                    new ChunkedWriteHandler()
            );
        }

    });

    InetSocketAddress inetSocketAddress = new InetSocketAddress("localhost", testPort);
    final ChannelFuture channelFuture =  clientBootstrap.connect(inetSocketAddress);

    //      channelFuture.addListener(
    //              new ChannelFutureListener() {
    //                  @Override
    //                  public void operationComplete(ChannelFuture future) throws Exception {
    //                      System.out.println("connected!");
    //                      
    //                      Channel clientChannel = channelFuture.getChannel();
    //                      ChannelFuture channelFuture2 = clientChannel.write( new ChunkedFile( new File("k:\\soft\\openjdk-7-fcs-src-b147-27_jun_2011.zip"))  );
    //                      
    //                      channelFuture2.addListener(
    //                              new ChannelFutureListener() {
    //                                  @Override
    //                                  public void operationComplete(ChannelFuture future) throws Exception {
    //                                      System.out.println("finished uploading!");
    //                                  }
    //                              }
    //                      );
    ////                        Thread.sleep(20000);
    ////                        clientChannel.getCloseFuture().await(100000);
    //                      
    //                  }
    //          }
    //      );

    // why do I need this sleep ??? for some reason, I can't just use channelFutureListener.operationComplete.
    // something else is killing the channel if i wrap things up inside channelFutureListener.operationComplete
    Thread.sleep(1000);

    Channel clientChannel = channelFuture.getChannel();
    ChannelFuture channelFuture2 = clientChannel.write( new ChunkedFile( new File("k:\\soft\\openjdk-7-fcs-src-b147-27_jun_2011.zip"))  );

    channelFuture2.addListener(
            new ChannelFutureListener() {
                @Override
                public void operationComplete(ChannelFuture future) throws Exception {
                    System.out.println("finished uploading!");
                }
            }
    );

1 个答案:

答案 0 :(得分:2)

升级到netty 3.2.7.Final。在之前的版本中有一个错误(我认为它是3.2.5.Final),它抛出了一个NPE。