【问题标题】:Service Unavailable 503 Error during File Transfer with Openfire using Smack使用 Smack 使用 Openfire 传输文件期间出现服务不可用 503 错误
【发布时间】:2015-09-27 10:54:23
【问题描述】:

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

这是我得到的输出:

状态 :: Error Error :: null Exception :: 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();
                }
          }
    });
  }

【问题讨论】:

  • 为什么这个问题被否决了?无论如何,你解决了问题吗?你用哪个smack,因为看起来你没有使用最新版本的smack..
  • 没有。我还没有解决问题。我使用 Smack 3.1.0。版本重要吗?
  • 当然,新的 4.1 版本有许多错误修正、更大的灵活性并且已为 Android 做好了准备(这在您的情况下并不重要)。而且,我还没有让它通过文件传输发送文件。您唯一需要注意的是,如果您使用不属于您的免费 xmpp 服务器,则该服务器必须支持文件传输。并非所有服务器都这样做...
  • @Opiatefuchs 在 smack 4.1 中做了哪些类型的错误修复?
  • 很多...不知道到底修复了什么,但有一些用于连接的部分。有很多人像你一样有同样的问题,转向 4.1 修复了它。请参阅此处:github.com/igniterealtime/Smack/wiki/… 以及社区内部的有用线程:community.igniterealtime.org/welcome

标签: xmpp openfire smack


【解决方案1】:

我遇到了同样的问题,我研究了这节并以这种方式解决了。

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

资源路径随着用户的每次改变而改变。假设我们要向该用户发送图像: “user1@mydomain”

您必须将 "/Resource" 部分添加到此 jid 中,它变为: user1@mydomain/资源

但是 /Resource 路径会随着存在而改变,因此您必须遵循每一个存在变化来更新资源路径。 最好的方法是让用户存在是在名册监听器中,在 presencheChanged() 方法中你得到最后一个用户资源部分,如下所示:

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
                    //...
                }
            });
}

资源字符串将是一些生成的字符串,如“6u1613j3kv”,jid 将变为:

user1@mydomain/6u1613j3kv

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

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 .

喜欢

XMPPTCPConnectionConfiguration.Builder configurationBuilder = 
XMPPTCPConnectionConfiguration.builder(); 

configurationBuilder.setResource("yourResourceName");

【讨论】:

    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2012-04-29
    • 2014-12-02
    • 2021-08-27
    • 2014-11-12
    • 1970-01-01
    • 2014-01-23
    • 2013-09-18
    相关资源
    最近更新 更多