Java Smack FileTransfer

时间:2013-04-15 15:03:41

标签: java macos smack

好的,我从网上获得了以下代码, 工作:

@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的东西,因为上面的代码片段完美无缺。

1 个答案:

答案 0 :(得分:0)

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

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