首页 > 代码库 > XMPP客户端库Smack 4.0.6版开发之六

XMPP客户端库Smack 4.0.6版开发之六

XMPP客户端库Smack 4.0.6版开发之六

作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs

五、名单Roster和在线状态Presence

名单可以让你跟踪其他用户是否在线,而且名单可以让你把用户组织到群组,比如朋友群或工作群。而其它的即时通信IM系统则把名单Roster视为好友列表、联系人列表等等。

 

1、名单条目

名单中的每一个用户都由RosterEntry来表示,它包括:

1)一个XMPP地址(比如”jsmith@example.com”)

2)你为用户编写的备注姓名(比如”Joe”)

3)名单中的群列表。如果名单的条目不属于任何群组,那么它被称为"unfiledentry"。

下面的代码片段会打印名单中所有的条目:

Rosterroster = connection.getRoster();

Collection<RosterEntry>entries = roster.getEntries();

for(RosterEntryentry : entries){

    System.out.println(entry);

}

 

还有获取单个条目的方法、获取"unfiledentry"的方法,获取一个群或所有群的方法。

 

2、在线状态

名单中的每个条目都有一个与之相关的在线状态。Roster.getPresence(Stringuser)方法会返回一个表示用户是否在线的Presence对象或者为空。为空是你还没有订阅用户是否在线的返回。

注意:通常情况下,在线状态的订阅总是绑定到名单中的用户,但这并不适应所有的情况。

 

一个用户的在线状态要么是在线,要么是离线。当用户在线时,他们的在线状态还可以包含扩展的信息,比如用户当前正在做什么,用户是否愿意被打扰等等。具体参考Presence类。

 

3、监听名单Roster和在线状态Presence的改变

Roster类的典型应用场景是以树状结构显示用户群和列表,并且用户列表中包含用户是否在线的状态。比如,参考下图所示的一个ExodusXMPP客户端的Roster。

 

在线状态的信息可能会经常变化,Roster条目也可能经常修改或删除。要监听Roster和Presence数据的变化,你应该使用RosterListener。要得到Roster改变的所有提醒,那么必须在登录XMPP服务器之前注册RosterListener。下面的代码片段注册了一个Roster的RosterListener,它能够在标准输出中打印任何Presence的改变。一个标准的客户端可以使用类似的代码用变化的信息来更新Roster界面。

Rosterroster = con.getRoster();

roster.addRosterListener(newRosterListener(){

    // 忽略事件public void entriesAdded(Collection<String> addresses){}

    public void entriesDeleted(Collection<String>addresses){}

    public voidentriesUpdated(Collection<String> addresses){}

    public void presenceChanged(Presencepresence){

        System.out.println(“Presencechanged: “+ presence.getFrom() + “ “ + presence);

    }

});

 

4、添加Entries到Roster

Roster和Presence使用一种基于权限的模型,用户必须得到其他人的许可才能把这些人添加到Roster。这样可以保护用户的隐私,确保了只有获得同意的用户才能查看到他们的Presence信息。因此,当你想添加某个用户到你的Roster中,必须得到该用户接受你的请求才可以。

如果有用户请求订阅你的在线状态Presence,这个用户必须先把你添加到他的Roster,因此他会发起请求,你必须选择接受或拒绝该请求。Smack通过以下三种方式来处理Presence的预订请求:

1)自动接受所有Presence的预订请求

2)自动拒绝所有Presence的预订请求

3)手动处理每一个Presence预订请求

这三种方式可以通过Roster.setSubscriptionMode(intsubscriptionMode)方法来设置请求的处理方式。简单的客户端通常使用第一种自动方式处理预订请求,而功能比较全的客户端应该选择第三种手动处理请求的方式,让终端用户自行决定是接受请求或是拒绝请求。如果使用手动方式,应该注册一个PacketListener来监听Presence.Type.SUBSCRIBE类型的Presence包。


XMPP客户端库Smack 4.0.6版开发之六