如何在订阅模式“两者”中添加名册

时间:2011-04-27 10:27:59

标签: java xmpp smack

我正在使用smack 3.1.0,当我添加一个名册时,我无法获得“两者”的订阅。谁能帮我? 下面是我的代码:

Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all);
Roster roster = connection.getRoster();
roster.createEntry("buddy@test.com","me",null)

代码执行后,我在openfire中观察到订阅是“to”

5 个答案:

答案 0 :(得分:40)

重写@ mschonaker的答案要更清楚一点。

两个用户都需要相互订阅接受他们收到的订阅请求。我们称他们为爱丽丝和鲍勃。 Alice向Bob发送订阅请求:

Presence subscribe = new Presence(Presence.Type.subscribe);
subscribe.setTo('bob@example.com');
connection.sendPacket(subscribe);

当Bob收到请求时,他批准了该请求:

Presence subscribed = new Presence(Presence.Type.subscribed);
subscribed.setTo('alice@example.com');
connection.sendPacket(subscribed);
鲍勃也可能对Alice的存在感兴趣,所以他订阅了她:

Presence subscribe = new Presence(Presence.Type.subscribe);
subscribe.setTo('alice@example.com');
connection.sendPacket(subscribe);

Alice需要批准Bob的请求:

Presence subscribed = new Presence(Presence.Type.subscribed);
subscribed.setTo('bob@example.com');
connection.sendPacket(subscribed);

Section 3.1 of RFC6121是目前最佳参考方式。

答案 1 :(得分:10)

两个用户都需要相互订阅。通过发送在线订阅节。在Smack:

    Presence presence = new Presence(Presence.Type.subscribe);
    presence.setTo(jid);
    connection.sendPacket(presence);

Section 3.1 of the RFC6121会为您提供语义细节。

答案 2 :(得分:2)

好的,我辛苦劳作了几天,终于让事情顺利进行了。谢谢@Joe Hildebrand,你的回答让我走上正确的道路来解决这个问题。我已经用手动订阅模式实现了它(即用户需要手动接受另一个用户的请求)。

如果用户尚未发送订阅或取消订阅,服务器会继续向用户推送订阅请求(重新登录时)。因此,您可以做的是将传入的订阅请求本地保存在列表中,并将其显示为手动接受/拒绝的“朋友请求列表”。如果您的应用程序重新启动(因此重新连接到服务器),服务器将再次推送订阅请求。

这是它的工作原理:

  • User1向User2发送订阅状态。
  • 在User1的名单中自动创建名单条目(但不在User2的名单中)。
  • User2收到User1的订阅请求。
  • User2将订阅的状态发送回User2(User2> User1订阅完成)。
  • User2检查User1是否在User2的名单中。 User1不在User2的名单中。 User2将订阅状态发送回User1。
  • 在User2的名单中自动创建名单条目。
  • User1从User2收到订阅状态。
  • User1检查User2是否在User1的名单中。 User2位于User1的名单中。 User1将订阅的状态发送回User2(User2> User1订阅完成)。

            final Presence newPresence = (Presence) packet;
            final Presence.Type presenceType = newPresence.getType();
            final String fromId = newPresence.getFrom();
            final RosterEntry newEntry = getRoster().getEntry(fromId);
    
            if (presenceType == Presence.Type.subscribe)
            {
                //from new user
                if (newEntry == null)
                {
                    //save request locally for later accept/reject
                    //later accept will send back a subscribe & subscribed presence to user with fromId
                    //or accept immediately by sending back subscribe and unsubscribed right now
                }
                //from a user that previously accepted your request
                else
                {
                    //send back subscribed presence to user with fromId
                }
            }
    

答案 3 :(得分:1)

如果您使用的是开放式服务器,您还可以使用User Service plugin来创建包含订阅的名单......

答案 4 :(得分:1)

同样的问题我面对但是我得到了如何订阅'两个'的解决方案

以下是添加用户时向用户发送订阅

 Presence pres = new Presence(Presence.Type.subscribed);
        pres.setPriority(24);
        pres.setMode(Presence.Mode.available);
        pres.setTo(friendJid);

        RoosterConnection.getConnection().sendStanza(pres);

和接收结束在连接类中放置下面的方法,presenceChanged是RosterListener的默认方法。

 @Override
public void presenceChanged(Presence presence) {
    mBus.post(presence);
    try {
        Presence pres = new Presence(Presence.Type.subscribed);
        pres.setTo(presence.getFrom());
        RoosterConnection.getConnection().sendStanza(pres);
    } catch (SmackException.NotConnectedException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}