Я пытаюсь использовать Smack для передачи файла между двумя компьютерами, подключенными к одному и тому же XMPP-серверу, но получаю странную ошибку.
Подводя итог, на целевом ПК зарегистрирован зарегистрированный FileTransferListener, например:
ftm.addFileTransferListener(new FileTransferListener() {
@Override
public void fileTransferRequest(FileTransferRequest request) {
System.out.println("Request received");
if (true) // Check to see if the request should be accepted
{
// Accept it
System.out.println("Entering FTListener because of FTRequest");
IncomingFileTransfer transfer = request.accept();
String id = request.getDescription();
String path = savePoint + System.getProperty("file.separator") + request.getFileName();
try
{
System.out.println("Receiving...");
transfer.recieveFile(new File(path));
// Information put in HashMap for later retrieval
System.out.println("IM - putting in path (" + id + "," + path + ")");
paths.put(id, path);
} catch (XMPPException e) {
logger.error("Error getting the VM file: " + e.getMessage());
}
}
else
{
// Reject it
request.reject();
logger.info("VM file transfer rejected");
}
}
});
Исходный ПК использует OutgoingFileTransfer следующим образом:
try
{
String nick = destHost + "@" + this.conn.getServer() + "/Smack";
//destHost = destination host name, conn = XMPP connection
System.out.println("OFT to " + nick);
OutgoingFileTransfer.setResponseTimeout(10000);
OutgoingFileTransfer oft = ftm.createOutgoingFileTransfer(nick);
oft.sendFile(f, name); //f = file to send, name = a message
while (!oft.isDone())
{
if (oft.getStatus().equals(Status.error))
{
System.out.println("ERROR!!! " + oft.getError());
oft.cancel();
return false;
}
System.out.println(oft.getStatus());
System.out.println(oft.getProgress());
System.out.println("5 sec sleep");
Thread.sleep(5000);
}
if (oft.getStatus().equals(Status.complete))
{
System.out.println("Transfer done");
return true;
}
if (oft.getStatus().equals(Status.error))
System.out.println("Transfer failed: " + oft.getError());
return false;
} catch (XMPPException e) {
System.out.println("Error sending VM image file with the FTM : " + e.getMessage());
return false;
} catch (InterruptedException e) {
System.err.println("Error sleeping during OFT : " + e.getMessage());
return false;
}
Когда я пытаюсь отправить файл, начинается исходящая передача файла, и целевой ПК получает запрос, но исходный ПК не может идти дальше, чем согласование передачи.
Это видно на выходе исходного компьютера ...
Начальная
0,0
2 сек сна
Переговоры по переговорам
0,0
2 сек сна
Поток переговоров
0,0
2 сек сна
Ошибка передачи: ноль
Я действительно раздражен, потому что я даже не получаю правильное сообщение об ошибке, поэтому я действительно не знаю, что пошло не так.
Это когда-нибудь случалось с кем-то еще?