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

Xmpp 使用Smack使用Openfire传输文件时出现服务不可用503错误,xmpp,openfire,smack,Xmpp,Openfire,Smack,我正试图通过服务器上的openfire和smack java库通过聊天发送一个文件 这是我得到的输出: 状态::错误::空异常::服务不可用(503)为 完成了吗?真的 以下是我的发送方和接收方功能: public void fileTransfer(String fileName, String destination) throws XMPPException { // Create the file transfer manager FileTransferManager

我正试图通过服务器上的openfire和smack java库通过聊天发送一个文件

这是我得到的输出:

状态::错误::空异常::服务不可用(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();
                }
          }
    });
  }

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

许多人使用“/Smack”或“/Resource”作为jid中的资源部分,但这可以通过另一种方式实现

资源路径随着用户状态的变化而变化。假设我们要将图像发送到此用户: ”user1@mydomain“

您必须将“/Resource”部分添加到此jid,它将变成: user1@mydomain/资源

但是/Resource路径会随着状态的变化而变化,所以您必须遵循每个状态的变化来更新资源路径。 最好的方法是在花名册侦听器中获取用户状态,并在presenceChanged()方法中获取最后一个用户资源部分,如下所示:

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
                    //...
                }
            });
}
EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
transfer.sendFile(new File("DirectoryPath"), "Description");
这意味着您必须按如下方式创建传出转账:

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
                    //...
                }
            });
}
EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)
transfer.sendFile(new File("DirectoryPath"), "Description");
这就是我在smack和Openfire上解决文件传输问题的方法

在你的情况下,jid就是目的地

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

xmpp.proxy.enabled - true
xmpp.proxy.externalip - MY_IP_ADDRESS
xmpp.proxy.port - 7777
我要说的是,我使用的是Openfire 4.0.2和Smack 4.2.2

这也可以通过简单的方式进行配置,只需打开资源即可

XMPPTCPConnectionConfiguration.Builder


为什么这个问题被否决了?不管怎样,你解决问题了吗?你用的是哪一种smack,因为你似乎没有用最新版本的smack。我还没有解决这个问题。我使用Smack 3.1.0。版本重要吗?当然,新版本4.1有很多错误修复,更灵活,并且已经为Android做好了准备(这在你的情况下并不重要)。但是,我还没有让它通过文件传输发送文件。唯一需要注意的是,如果您使用的是一个免费的xmpp服务器,而不是您的,那么该服务器必须支持文件传输。并非所有的服务器都会这样做…@Opiatefuchs在smack 4.1中修复了哪些类型的错误?许多服务器并不确切知道修复了哪些错误,但有些部分用于连接。有很多人和你一样有同样的问题,转向4.1解决了它。请参见此处:社区内还有一些有用的线程: