使用Smack进行文件传输不起作用

时间:2011-05-18 17:30:47

标签: xmpp file-transfer smack

我正在尝试使用Smack在同一个XMPP服务器上连接的两台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

我真的很生气,因为我甚至没有得到正确的错误信息,所以我真的不知道出了什么问题。

这是否曾经发生在其他人身上?

2 个答案:

答案 0 :(得分:3)

看起来你在Smack中遇到known issue,希望在下一个版本中修复。

更新:现在已经修复,将在3.2.1版本中。

答案 1 :(得分:1)

XMPP字节流已明确指定,但是是一个相当复杂的主题,因为有多种方法可以建立这样的流。 您的代码在快速审核时看起来正确。现在,下一步将分析客户端和服务器之间发送的XMPP节。这应该会给你一个关于错误原因的提示。还要确保使用支持IBB的smack 3.2.0,这样可以增加通过XMPP成功传输文件的机会。