2

Smackを使用して、同じXMPPサーバーに接続されている2台のPC間でファイルを転送しようとしていますが、奇妙なエラーが発生します。

要約すると、宛先PCには次のように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");
    }
  }
});

ソースPCは、次のように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;
}

ファイルを送信しようとすると、送信ファイル転送が開始され、宛先PCは要求を受信しますが、送信元PCは転送ネゴシエーションを続行できません。

これはソースPCの出力に見られます...

イニシャル

0.0

2秒の睡眠

転送の交渉

0.0

2秒の睡眠

ネゴシエーションストリーム

0.0

2秒の睡眠

転送に失敗しました:null

適切なエラーメッセージが表示されないので本当にイライラしているので、何が悪かったのかよくわかりません。

これは他の誰かに起こったことがありますか?

4

2 に答える 2

3

Smackで既知の問題が発生しているようですが、次のリリースで修正されることを願っています。

更新:これは修正され、バージョン3.2.1になります。

于 2011-05-20T17:08:19.417 に答える
1

XMPPバイトストリームは適切に指定されていますが、そのようなストリームを確立する方法は複数あるため、かなり複雑なトピックです。あなたのコードは簡単なレビューで正しく見えます。次のステップは、クライアントとサーバーの両方の間で送信されるXMPPスタンザを分析することです。これにより、エラーの原因に関するヒントが得られます。また、IBBをサポートするsmack 3.2.0を使用してください。これにより、XMPPを介したファイル転送が成功する可能性が高くなります。

于 2011-05-18T21:03:56.347 に答える