使用 Smack 4.2.3 的文件传输出现服务不可用错误

File transfer using Smack 4.2.3 gives service-unavailable error

我正在使用 smack 4.2.3 开发 XMPP 客户端。在 linux 平台上使用 ejabberd 作为 XMPP 服务器。 使用以下代码发送文件:

public static void sendFile(String path, String description){
String sFqdn = currentUser.getFqdn();
if(sFqdn.equals(null)) return;
String node = XmppStringUtils.parseLocalpart(sFqdn);
String domain = XmppStringUtils.parseDomain(sFqdn);
String resource = XmppStringUtils.parseResource(sFqdn);

    try {
        EntityFullJid fqdn = entityFullFrom(node, domain, resource);
        OutgoingFileTransfer transfer = FileTransferManager.getInstanceFor(connection).createOutgoingFileTransfer(fqdn);
        transfer.sendFile(new File(path), description);
    } catch (SmackException e) {
        e.printStackTrace();
    } catch (XmppStringprepException e) {
        e.printStackTrace();
    }

}

并接收:

if(fileTransferManager == null){
fileTransferManager = FileTransferManager.getInstanceFor(connection);
fileTransferManager.addFileTransferListener(new FileTransferListener() {
@Override
public void fileTransferRequest(final FileTransferRequest request) {
// Accept it

            IncomingFileTransfer transfer = request.accept();
            try {
                transfer.recieveFile(new File(dir_path+request.getFileName()));
            } catch (SmackException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
                }
            });
            }
        });
    }

有时它会在用户之间成功发送文件,但大多数时候我会收到此 XMPP 错误:

D/SMACK: RECV (1): 测试文件

D/SMACK: SENT (1): <服务不可用 xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>

在 ejabberd 配置文件中,我已成功启用模块“mod_proxy65”

我能想到的一个原因是,它可能是由于接收器改变了持续存在而发生的,这改变了它的资源。 虽然我在 Roster 的 presenceChanged() 方法中跟踪存在,但仍然没有成功。我想知道smack有没有办法用静态资源连接到服务器?

还有一点,有没有HTTP_FILE_UPLOAD(XEP-0363)的例子,我在smacks的官方文档里找不到。

在 ignite realtime 的论坛上讨论后,我发现我遇到了 bug

强制解决此错误的 in-band 字节流。

FileTransferNegotiator.IBB_ONLY 设置为 true 对我有用。

请同时查看 FileTransferNegotiator class 中的第 76 行。