Передача файлов с помощью Smack не работает - PullRequest
2 голосов
/ 18 мая 2011

Я пытаюсь использовать 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 сек сна

Ошибка передачи: ноль

Я действительно раздражен, потому что я даже не получаю правильное сообщение об ошибке, поэтому я действительно не знаю, что пошло не так.

Это когда-нибудь случалось с кем-то еще?

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

Похоже, вы столкнулись с известной проблемой в Smack, которая, будем надеяться, будет исправлена ​​в следующем выпуске.

Обновление : теперь это исправленобыть в версии 3.2.1.

1 голос
/ 19 мая 2011

Потоки XMPP хорошо определены, но это довольно сложная тема, поскольку существует несколько способов создания такого потока.Ваш код выглядит сразу после быстрого просмотра.Теперь следующим шагом будет анализ разделов XMPP, передаваемых между клиентами и сервером.Это должно дать вам подсказку о причине ошибки.Также обязательно используйте smack 3.2.0 с поддержкой IBB, что должно повысить вероятность успешной передачи файла через XMPP.

...