`
zhonglunshun
  • 浏览: 138991 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

asmack搜索添加好友

阅读更多

在做添加好友之间,必须要对xmpp的好友订阅有一定的了解,以前我不了解其中原理,盲目的做,以为添加到了各自的列表能够发消息就没事了,后来发现这样会导致很多问题,比如好友上下线无提醒,好友更新了vcard没有提示等一系列和好友相关的问题都出来了。

 

后来终于重视这个问题,查找相关资料,自行百度,发现很多资料都是只说了单边实现没有设计原理,事实上,那也不算真的实现了,现在我来说下原理和流程,希望对同是做即时通讯的同学们有所帮助;

 

我们知道,一个好友就对应一个RosterEntry,那我们看怎么来构造一个RosterEntry对象:

 

 

/**
     * Creates a new roster entry.
     *
     * @param user the user. 用户的jid
     * @param name the nickname for the entry. 指定给这个用户的昵称(其实我更愿意叫做备注)
     * @param type the subscription type. 这个用户和我的好友关系类型
     * @param status the subscription status (related to subscriptions pending to be approbed).这个用户和我的好友状态
     * @param connection a connection to the XMPP server.连接,不解释
     */
    RosterEntry(String user, String name, RosterPacket.ItemType type,
                RosterPacket.ItemStatus status, Roster roster, Connection connection) {
        this.user = user;
        this.name = name;
        this.type = type;
        this.status = status;
        this.roster = roster;
        this.connection = connection;
    }

 

 

 

上面的user和nickname还有Connection相信大家都知道了,Roster是花名册,相信大家也不陌生,通过XmppConnection.getRoster()可以获取到当前连接的花名册,我们重点来说下type和 status是干嘛用的;

 

凭我们用过qq的经验来看,添加好友是需要有几种状态的,比如我加了你,你同意了,但是你不想把动态让我看到,所以你不一定加我,这就是单方订阅,我加你,但是你拒绝了我 ,那我们就没啥关系,我加了你,你也加了我,那我们就是朋友了,我们是双方订阅,现在我们来捋一捋xmpp中有哪几种状态;

 

我们先看itemType是个什么鬼,点进去源码看一下;

 

 

public static enum ItemType {

        /**
         * The user and subscriber have no interest in each other's presence.
         */
        none,

        /**
         * The user is interested in receiving presence updates from the subscriber.
         */
        to,

        /**
         * The subscriber is interested in receiving presence updates from the user.
         */
        from,

        /**
         * The user and subscriber have a mutual interest in each other's presence.
         */
        both,

        /**
         * The user wishes to stop receiving presence updates from the subscriber.
         */
        remove
    }

 

 

我们看到,这是一个枚举类型,上面都有注释,为了大家更清楚一些我就给大家翻译一下;none表示我和对方没有任何关系;to表示我发了我请求订阅了对方,对方同意了,但是他没有订阅我;from就是to反过来,他订阅了我,但是我没有订阅他;both表示我们双方互相订阅了;remove表示我想取消以前的订阅;

 

这种订阅状态是通过发送Presence来实现的。我们结合具体的应用场景来讲一下,怎么来订阅:

 

 

一、添加者

1、加入到 用户 roster列表

<iq type="set"><query xmlns="jabber:iq:roster"><item jid="13548583222@iz28sr0uiyaz" name="13548583222"></item></query></iq>


2、发送订阅presence

<presence type="subscribe" to="13548583222@iz28sr0uiyaz"></presence>

3、对方同意,互相订阅
<presence type="subscribed" to="13548583222@iz28sr0uiyaz"></presence>


二、被添加者

接受好友添加

1 、发送接受请求订阅
 <presence type="subscribed" to="13548583222@iz28sr0uiyaz"></presence>

2、添加到roster列表
<iq type="set"><query xmlns="jabber:iq:roster"><item jid="13548583222@iz28sr0uiyaz"></item></query></iq>

3、发送订阅
<presence type="subscribe" to="13548583222@iz28sr0uiyaz"></presence>

这时添加者发现已经在花名册中了,只需要发送subscribed就OK了,同时更新自己显示的列表;
添加者:<presence type="subscribed" to="13548583222@iz28sr0uiyaz"></presence>

 

 

上面这个流程通过发包的方式呈现,可能大家不是很明白,那么我画一个UML图加深理解;

 



 到此,两个人就成为了双方的好友了,这时候只要有一方有更新,另一方就会受到与之相关的消息,比如vcard更新,状态更新等;

 

那么既然加了好友,我们来看下好友列表这块,如果我们只想显示双方都添加对方好友的列表,那我们需要做一个刷选,回归到前面的RosterEntry来,做一个判断:

 

if ( entry.getType()==ItemType.both) {
				User user = transEntryToUser(entry);
				tempUsers.add(user);
				UserManager.getInstance(mContext).saveUserDetail2Local(user);
			}

 这样的话,好友列表就只有互相都订阅的好友了;

 

本文属原创,如需转载请注明出处,尊重劳动成果,谢谢!

有问题欢迎下面留言问题;

 

下面补充一点,关于删除好友出现了删除好友后无需处理就是好友的问题,于是我跟踪了下发送的包,正确的顺序应该是这样的:

 

如同增加一个名册条目, 如果服务器能成功地处理roster set那么它必须在该用户的名册中更新该条目, 发送一个roster push到该用户的所有感兴趣的资源(其中的'subscription'属性值设为"remove"), 并发送一个IQ result给初始的资源; 详见章节2.3.
另外, 该用户的服务器可能需要生成一个或更多subscription相关的presence节, 如下:
如果该用户对该联系人有一个出席信息订阅, 那么该用户的服务器必须发送一个type为"unsubscribe"的presence节给该联系人(为了对该联系人的出席信息取消订阅).
如果该联系人对该用户有一个出席信息订阅, 那么该用户的服务器必须发送一个type为"unsubscribed"的presence节给该联系人(为了取消该联系人对该用户的订阅).
如果出席信息订阅是相互的, 那么该用户的服务器必须同时发送type为"unsubscribe"presence节和type为"unsubscribed"的的presence节给该联系人.

 

也就是说,我们需要对于互相订阅的用户,我们需要发送两个presence:

Presence.Type.unsubscribe,和Presence.Type.unsubscribed,同时,我们需要从花名册中移除这个用户:

roster.removeEntry(entry);

 

 

  • 大小: 28.7 KB
1
2
分享到:
评论

相关推荐

    asmack android

    asmack asmack asmack asmack asmack

    asmack连接openfire测试

    1. 添加依赖:在Android项目中,你需要将asmack库添加到项目的依赖中,以便在代码中使用其提供的API。 2. 创建连接配置:配置XMPP连接参数,如服务器地址、端口、用户名和密码。Openfire服务器的默认端口通常是5222...

    asmack-4.0.7源码

    - **Roster操作**:通过`Roster`类管理好友列表,包括添加、删除好友,获取好友信息等。 - **事件监听**:可以注册`PacketListener`和`PacketCollector`来监听服务器返回的各种数据包,实现异步处理。 - **自定义...

    asmack 4.0.5 帮助文档

    **asmack 4.0.5 帮助文档** ASMack是一款开源的Java库,专为Android平台设计,用于实现XMPP(Extensible Messaging and Presence Protocol)协议。XMPP是一种基于XML的实时通信协议,广泛应用于即时消息、在线状态...

    asmack源码

    `Roster`类用于处理好友列表,`ChatManager`处理一对一聊天,而`MUCManager`则处理多用户聊天室。 **4. 消息与事件处理** ASMack通过`PacketListener`和`PacketFilter`接口提供了消息监听和过滤机制。开发者可以...

    asmack类库

    - **扩展性**:asmack支持Jabber协议扩展,可以方便地添加自定义功能或扩展协议。 **3. 使用asmack的步骤** 1. 添加依赖:将asmack的jar文件或者通过Gradle/Maven等构建工具引入到项目中。 2. 创建XMPP连接:初始化...

    asmack-master.zip

    7. **Roster管理**:处理好友列表,添加、删除和管理联系人。 8. **扩展功能**:支持自定义的XMPP扩展,如MUC(多用户聊天室)和XEP(XMPP扩展协议)。 **使用asmack进行开发** 在Android项目中集成asmack库,...

    基于asmack的在线聊天源代码——调通可运行

    Asmack是一个Android平台上的XMPP(Extensible Messaging and Presence Protocol)库,它允许开发者创建支持聊天、好友搜索等基本IM功能的应用。本项目提供了一套基于Asmack的在线聊天源代码,经过配置和调试后,...

    asmack4.0.7的包带源码

    4. **扩展功能**:如果Asmack本身不提供某些特定功能,开发者可以修改源码添加这些功能。 5. **安全增强**:通过查看源码,开发者可以确保数据传输的安全性,如使用加密通信等。 总之,Asmack 4.0.7是一个强大的...

    asmack的jar包

    asmack的jar包

    asmack4.0.7库+源码+api

    在Android项目中集成Asmack4.0.7,首先需要添加`asmack-android-8-4.0.7.jar`到项目的类路径。然后,通过API文档了解如何初始化连接、创建用户会话、发送和接收消息等。开发者还需要配置AndroidManifest.xml以允许...

    asmack支持文件传输

    asmack支持文件传输

    asmack-android

    ASMACK的这个版本可能包含了一些性能改进、bug修复或者新特性的添加,具体变化需要查看其发行说明或变更日志来了解详细信息。 标签"asmack"和"android"进一步强调了这个库是与Android开发和ASMACK库相关的。在...

    asmack源码(asmack-android-18-source-0.8.9)

    asmack是Android平台上一个流行的XMPP(Extensible Messaging and Presence Protocol)库的开源实现,它基于Smack库并针对Android进行了优化。这个源码包"asmack-android-18-source-0.8.9"是特定于Android API Level...

    Android基于Openfire服务器asmack开发的即时通讯示例

    3. **好友获取**:使用Roster类可以管理用户的联系人列表,包括获取、添加、删除好友。RosterListener可以监听联系人列表的变化,例如好友上线、下线或者更改状态等。 **高级功能和挑战** 即时通讯系统不仅要实现...

    xmpp android asmack 即时通讯

    你可以添加、删除联系人,并获取联系人的在线状态。 **D3Xmpp_v2** - 这个文件可能是包含示例代码或特定版本的ASMACK库。开发者可以参考这个资源来快速了解如何在Android应用中集成和使用XMPP服务。 在实际开发中...

    asmack-19源码

    开发者可以根据需求对ASMack源码进行修改,例如添加新的扩展功能,优化性能,或调整网络连接策略。修改后的源码需要重新编译并打包到应用中,以实现自定义的即时通讯服务。 4. **构建流程** - **获取源码**:首先...

Global site tag (gtag.js) - Google Analytics