Smack FileTransferManager.addFileTransferListener永远不会被调用。

问题描述 投票:0回答:1

我正在使用smack 4.3.4开发一个独立的Java测试应用程序。我使用In-Band进行文件传输。

FileTransferManager fileTransferManager = FileTransferManager.getInstanceFor(connection);
        FileTransferNegotiator.IBB_ONLY = true;
        OutgoingFileTransfer fileTransfer = null;
        try {
            fileTransfer = fileTransferManager.createOutgoingFileTransfer(JidCreate.entityFullFrom(buddyJID + "/Spark"));
        } catch (XmppStringprepException ex) {
            LOG.log(Level.SEVERE, null, ex);
        }
       if (fileTransfer != null) {
            OutgoingFileTransfer.setResponseTimeout(500);
            ...
           try {
                    fileTransfer.sendFile(file, "sending attachment...");
                } catch (SmackException ex) {
                    LOG.log(Level.SEVERE, null, ex);
                }
           ...

我监控文件传输,并正确发送。

INFO: Initializing connection to server localhost port 5222 [Wed Apr 29 15:36:25 CEST 2020]
INFO: Connected: true [Wed Apr 29 15:36:45 CEST 2020]
INFO: user001 authenticated? true [Wed Apr 29 15:36:46 CEST 2020]
...
INFO: Sending attachment 'test.txt' to user user002@localhost [Wed Apr 29 15:36:55 CEST 2020]
INFO: status is:Initial [Wed Apr 29 15:36:55 CEST 2020]
INFO: status is:Initial [Wed Apr 29 15:36:55 CEST 2020]
INFO: File transfer status: Negotiating Transfer, progress: 0.0 [Wed Apr 29 15:36:55 CEST 2020]
INFO: test.txt has been successfully transferred. [Wed Apr 29 15:36:56 CEST 2020]
INFO: The file transfer is done. [Wed Apr 29 15:36:56 CEST 2020]
INFO: Attachment test.txt sent from user001@localhost to user002@localhost [Wed Apr 29 15:36:56 CEST 2020]

当我的用户连接并登录到Openfire,甚至在开始发送附件之前,我添加了一个监听器来监听文件传输。

final FileTransferManager manager = FileTransferManager.getInstanceFor(connection);
//        FileTransferNegotiator.setServiceEnabled(connection, true);   
        manager.addFileTransferListener((FileTransferRequest request) -> {
            // Check to see if the request should be accepted
            if (request.getFileName() != null) {
                try {
                    // Accept it
                    IncomingFileTransfer transfer = request.accept();
//                    monitorFileTransfer(transfer, "");
                    try (InputStream fileReceived = transfer.receiveFile();
                            BufferedInputStream bis = new BufferedInputStream(fileReceived)) {
                    ...
              } else {
                try {
                    // Reject it
                    request.reject();
                    LOG.warning("File rejected " + request.getFileName());
                } catch (SmackException.NotConnectedException | InterruptedException ex) {
                    LOG.log(Level.SEVERE, null, ex);
                }
            }

然而,监听器从未被调用。我是否需要在特定的时刻添加监听器?是否还有其他我所遗漏的东西?结果是文件传输被发送到Openfire,却从未被消耗。

最后一节。

<iq xmlns="jabber:client" to="user001@localhost/aktuu2n806" from="localhost" id="679-1085" type="get">
  <query xmlns="jabber:iq:version"/>
</iq>
<iq xmlns="jabber:client" to="localhost" id="679-1085" type="error">
  <error xmlns="jabber:client" type="modify">
    <not-acceptable xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
  </error>
</iq>

我的代码是基于... 文档范例. 我需要配置其他东西吗?因为它们是以带内传输的方式传输的,我不应该。

先谢谢你的及时回复。

java xmpp openfire smack
1个回答
0
投票

文件传输实际上并没有发生,这就是为什么监听器在监听,但没有收到任何东西。

要发送一个文件,你需要收件人的完整JID。如果你使用Smack,没有物理XMPP客户端(比如spark)。在这种情况下,你可以使用 "Smack "或 "Resource"(参见 此处).

fileTransfer = fileTransferManager.createOutgoingFileTransfer(JidCreate.entityFullFrom(buddyJID + "/Smack")));

然而,我仍然得到一个错误。

XMPP error reply received from user002@localhost/Smack: XMPPError: not-allowed - cancel

文件没有发送。

更新:当然,问题与smack无关。问题是我创建的工具对同一个文件进行读写,结果文件被擦掉了,出错的原因是smack被要求传输一个空文件。所以,如果你看到这个错误,请先检查你试图传输的文件,它可能有0个字节。

© www.soinside.com 2019 - 2024. All rights reserved.