好的,我从网上获得了以下代码, 工作:
@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的东西,因为上面的代码片段完美无缺。
答案 0 :(得分:0)
有效的案例应该是抛出异常。您在传输对象上调用两次接收。第二次调用在尝试再次创建文件时应该产生异常。在这种情况下,第二次调用以及线程创建是不必要的,因为transfer()方法是异步的并且具有自己的内部线程。
很难说为什么它不适用于您的状态检查,因为您没有显示您正在执行此检查的位置。我怀疑你是在读线程上调用它,从而阻止读取新数据包。您的循环检查传输状态应该在自己的线程中运行。