无法使用smack' XMPPError传输文件:服务不可用 - 取消'

时间:2017-07-11 09:51:07

标签: android smack

我尝试使用smack扩展库4.2.0传输文件,但无法成功传输文件。当我尝试传输文件时,这是我得到的错误

org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPP error reply received from 252615100006@server/Smack: XMPPError: service-unavailable - cancel

即使同行00006在线,但我不知道为什么我收到同伴的错误

这是我传输文件的代码

public void sendImageMessage(String sendTo, String imagePath) throws XmppStringprepException {
        FileTransferManager manager = FileTransferManager.getInstanceFor(mConnection);
        EntityBareJid jid = JidCreate.entityBareFrom(sendTo);
        EntityFullJid entityFullJid = JidCreate.entityFullFrom(jid+"/Smack");
        Domainpart domainpart = entityFullJid.getDomain();
//        Log.d(TAG ," JID Domain "+entityFullJid.do)

        OutgoingFileTransfer outgoingFileTransfer = manager.createOutgoingFileTransfer(entityFullJid);
        File file = new File(imagePath);
        try {
            outgoingFileTransfer.sendFile(file, file.getName());
        } catch (SmackException e) {
            e.printStackTrace();
        }
        while (!outgoingFileTransfer.isDone()) {
            if (outgoingFileTransfer.getStatus().equals(FileTransfer.Status.error)) {
                System.out.println("ERROR!!! " + outgoingFileTransfer.getError());
            } else if (outgoingFileTransfer.getStatus().equals(FileTransfer.Status.cancelled)
                    || outgoingFileTransfer.getStatus().equals(FileTransfer.Status.refused)) {
                System.out.println("Cancelled!!! " + outgoingFileTransfer.getError());
            }
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        if (outgoingFileTransfer.getStatus().equals(FileTransfer.Status.refused) || outgoingFileTransfer.getStatus().equals(FileTransfer.Status.error)
                || outgoingFileTransfer.getStatus().equals(FileTransfer.Status.cancelled)) {
            System.out.println("refused cancelled error" + outgoingFileTransfer.getError().toString());
        } else {
            System.out.println("Successfully_SEND");
        }

非常感谢任何帮助和指导

编辑: 我用户使用我的服务器来传输文件的火花客户端它已经转移了文件。所以问题不在于服务器我在客户端的代码中很薄

1 个答案:

答案 0 :(得分:0)

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

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

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

您必须添加" /资源"或者" / Smack" 这个jid的一部分就变成了这个: 的 USER1 @ MYDOMAIN /资源

<强> USER1 @ MYDOMAIN /拍击

但资源路径随着状态而变化,因此您必须遵循每个状态更改来更新资源路径。 最好的方法是让用户出现在名册监听器中,并在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
                    //...
                }
            });
}

资源字符串将是一些生成的字符串,如&#34; 6u1613j3kv&#34; ,jid将变为: 的 USER1 @ MYDOMAIN / 6u1613j3kv

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

EntityFullJid jid = JidCreate.entityFullFrom("user1@mydomain/6u1613j3kv"); 
OutgoingFileTransfer transfer = manager.createOutgoingFileTransfer(jid)

在你的情况下:

EntityBareJid jid = JidCreate.entityBareFrom(sendTo);
EntityFullJid entityFullJid = JidCreate.entityFullFrom(jid + resource);

其中resource是来自侦听器中的Presence的资源部分。

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

另外,您必须在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");