使用Smack使用Openfire进行文件传输时出现服务不可用503错误

时间:2015-07-09 07:44:50

标签: xmpp openfire smack

我正在尝试使用服务器上的openfire和smack java库通过聊天发送文件。

这是我得到的输出:

  

状态::错误错误:: null异常:: service-unavailable(503)是   它完成了吗?真

以下是我的发送方和接收方功能:

public void fileTransfer(String fileName, String destination) throws XMPPException {

    // Create the file transfer manager
    FileTransferManager manager = new FileTransferManager(connection);
    FileTransferNegotiator.setServiceEnabled(connection,true);
    // Create the outgoing file transfer
    OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(destination);

    // Send the file
    transfer.sendFile(new File(fileName), "You won't believe this!");
    try {
        Thread.sleep(10000);
    }
    catch(Exception e){}
    System.out.println("Status :: " + transfer.getStatus() + " Error :: " + transfer.getError() + " Exception :: " + transfer.getException());
    System.out.println("Is it done? " + transfer.isDone());
}

public void fileReceiver(final boolean accept, final String fileName) {
    // Create the file transfer manager
    final FileTransferManager manager = new FileTransferManager(connection);

    // Create the listener
    manager.addFileTransferListener(new FileTransferListener() {
          public void fileTransferRequest(FileTransferRequest request) {
              // broadcast something here. Wheather users want to accept file
                // Check to see if the request should be accepted
                if(accept) {
                      // Accept it
                      IncomingFileTransfer transfer = request.accept();
                  try {
                      transfer.recieveFile(new File(fileName));
                      System.out.println("File " + fileName + "Received Successfully");
                      //InputStream input = transfer.recieveFile();
                  } catch (XMPPException ex) {
                      Logger.getLogger(XmppManager.class.getName()).log(Level.SEVERE, null, ex);
                  }
                } else {
                      // Reject it
                      request.reject();
                }
          }
    });
  }

1 个答案:

答案 0 :(得分:1)

我有同样的问题,我调查了这一节并以这种方式解决了。

很多人使用" / Smack "或" /资源" 作为jid中的资源部分,但这可以通过其他方式完成。

资源路径随着用户的每次更改而变化。让我们说我们想要向这个用户发送图像: 的" USER1 @ MYDOMAIN"

您必须将" /资源" 部分添加到此jid中,它将变为: 的 USER1 @ MYDOMAIN /资源

/资源路径随着状态而变化,因此您必须按照每次状态更改来更新资源路径。 最好的方法是让用户出现在名册监听器中,并在presencheChanged()方法中获得最后一个用户资源部分:

Qt5Core_DIR:PATH=C:/ProgramData/Anaconda3/Library/lib/cmake/Qt5Core

资源字符串将是一些生成的字符串,如" 6u1613j3kv"和jid将成为:

Roster roster=getRoster();
roster.addRosterListener(new RosterListener() {
                @Override
                public void entriesAdded(Collection<Jid> addresses) {
                    Log.d("entriesAdded", "ug");
                    context.sendBroadcast(new Intent("ENTRIES_ADDED"));
                }

                @Override
                public void entriesUpdated(Collection<Jid> addresses) {
                    Log.d("entriesUpdated", "ug");
                }

                @Override
                public void entriesDeleted(Collection<Jid> addresses) {
                    Log.d("entriesDeleted", "ug");
                }

                @Override
                public void presenceChanged(Presence presence) {
                    Log.d("presenceChanged", "ug");
                    //Resource from presence
                    String resource = presence.getFrom().getResourceOrEmpty().toString();
                    //Update resource part for user in DB or preferences
                    //...
                }
            });
}

这意味着您必须像这样创建传出转移:

user1@mydomain/6u1613j3kv

这就是我在smack和Openfire上解决文件传输问题的方法。

在您的情况下,jid是目的地。

另外,您必须在Openfire服务器中添加以下属性:

EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
transfer.sendFile(new File("DirectoryPath"), "Description");

请注意,我使用的是Openfire 4.0.2和Smack 4.2.2。

这也可以通过简单的方式进行配置,只需在

上设置资源即可
  

XMPPTCPConnectionConfiguration.Builder。

xmpp.proxy.enabled - true
xmpp.proxy.externalip - MY_IP_ADDRESS
xmpp.proxy.port - 7777