0

好的,我从网上得到了以下代码,它确实有效:

@Override
public void fileTransferRequest(FileTransferRequest request) {
    // Check to see if the request should be accepted

    final IncomingFileTransfer transfer = request.accept();
    runnningFileTransfer = transfer;
    try
    {
       final File file = new File("/Users/Akku/Downloads/in2" + request.getFileName());
       transfer.recieveFile(file);
       t = new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                transfer.recieveFile(file);
                System.out.println("DONE?");
            } catch (XMPPException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
       });
       t.run();

此代码运行,对于我的 10MB 测试文件,它需要相当多的时间。可悲的是,我需要知道转移是否完成或进展如何。有趣的是,我还从网上得到了这部分(它只是休眠并检查进度),当我附加它时,文件传输不再起作用:

       while(!transfer.isDone()) 
       {
            if(transfer.getStatus().equals(Status.error))
            {
                 System.out.println("ERROR"+transfer.getError() + " EX: " + transfer.getException());
            } 
            else 
            {
                 System.out.println("Written: "+transfer.getAmountWritten());
                 System.out.println("STATUS"+transfer.getStatus());
                 System.out.println("PROGRESS"+transfer.getProgress());
            }
        try
        {
                Thread.sleep(10000);
                System.out.println("Waiting...");
           }
           catch (Exception e)
           {
            e.printStackTrace();
           }
       }

任何提示为什么会发生这种情况?我猜这是Java,因为上面的代码片段完美无缺。

4

1 回答 1

0

有效的情况应该是抛出异常。您在传输对象上调用了两次接收。第二次调用应在尝试再次创建文件时产生异常。在这种情况下,第二次调用以及线程创建不是必需的,因为 transfer() 方法是异步的并且具有自己的内部线程。

很难说为什么它不适用于您的状态检查,因为您没有显示您在哪里进行此检查。我的怀疑是您在读取线程上调用它,从而阻止读取新数据包。您对传输状态的循环检查应该在其自己的线程中运行。

于 2013-04-15T16:42:24.560 回答