3

经过数小时的调试并试图找出为什么使用 aSmack 文件传输无法正常工作,而正常的消息传递是,我终于设法将其归结为这一点。

当我按照 Smack 文档中给出的方法获取用户的名册列表时,Openfire 服务器正在发送名册的 JID,最后缺少 /。

Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry r : entries) {
    Log.v("Gabriel","Receiving: " + r.getUser());
}      

例如,如果我收到来自用户 gabriel 的消息,我会得到“发件人”为:

gabriel@dragonov/Smack

但是 r.getUser() 以

gabriel@dragonov

甚至

connection.getRoster().getPresence(contactName).getFrom()

正在返回为“gabriel@dragonov”。

这导致文件传输失败,但奇怪的是不是常规消息传递。但是,当我在末尾手动添加 /Smack

 OutgoingFileTransfer transferr = manager.createOutgoingFileTransfer(contactJID+"/Smack");

有用。

我的问题是,如何接收包含资源部分的完整 JID 或配置文件传输以使其在使用裸 JID 时不会失败?


编辑:

我尝试了以下方法:

 Log.v("Gabriel", entries.size() + " buddy(ies):");
    for (RosterEntry r : entries) {
        Log.v("Pat","adding: " + r.getType() + "  " + r.getName());
        contacts.add(r.getUser());
    }      

    for (String contact : contacts){
        Iterator<org.jivesoftware.smack.packet.Presence> presences = connection.getRoster().getPresences(contact);
        Log.v("Gabriel", contact+" has: ");
        while(presences.hasNext()){
            Log.v("Gabriel",presences.next().getFrom());
        }           
    }

但我仍然得到裸身份证。

输出:gabriel@dragonov 有:gabriel@dragonov

4

1 回答 1

0

用于Iterator<Presence> Roster.getPresences(String user)从用户的所有已知资源中获取存在信息。对于这个 Presence 实例getFrom()应该返回一个完整的 JID,你可以在FileTransferManager.createOutgoingFileTransfer().

我创建了SMACK-430,关于在createOutgoingFileTranfer(). 它确实应该抛出一个异常,以便 smack 用户不必调试几个小时来找到原因(尽管它在方法 javadoc 中说明)。SMACK-430 还解释了为什么 FileTransferManager 需要完整的 JID 而不能与裸 JID 一起使用。

于 2013-03-20T10:27:02.990 回答