名册和存在
通过该名册,您可以跟踪其他用户的可用性(“状态”)。名册还允许您将用户组织成“朋友”和“同事”等组。其他IM系统将名单称为好友列表,联系人列表等。
甲Roster
使用获得的实例Roster.getInstanceFor(XMPPConnection)
方法。
名册条目
名册中的每个用户都由RosterEntry表示,其中包括:
- XMPP地址(例如jsmith@example.com)。
- 您分配给用户的名称(例如“Joe”)。
- 条目所属的名单中的组列表。如果名单条目不属于任何组,则称其为“未归属条目”。以下代码段打印名单中的所有条目:
Roster roster = Roster.getInstanceFor(connection);Collectionentries = roster.getEntries();for (RosterEntry entry : entries) { System.out.println(entry);}
还存在获取单个条目,未归档条目列表或获取一个或所有名单组的方法。
存在
名册中的每个条目都有与之相关的存在。该Roster.getPresence(String user)
方法将返回具有用户存在的Presence对象,或者null
如果用户不在线或您没有订阅用户的存在。注意:通常情况下,在线订阅始终与名单上的用户相关联,但在所有情况下都不是这样。
用户可以在线或离线。当用户在线时,他们的存在可能包含扩展信息,例如他们当前正在做什么,他们是否希望被打扰等。有关更多详细信息,请参阅Presence类。
听取名册和在场变动
名册类的典型用法是显示组和条目的树视图以及每个条目的当前存在值。例如,请参见右侧Exodus XMPP客户端中显示名单的图像。
状态信息可能会经常更改,并且名单条目也可能会更改或删除。要监听更改名单和状态数据,应使用RosterListener。要获知有关名单的所有更改,应在登录XMPP服务器之前注册RosterListener。以下代码片段将RosterListener注册到Roster,该名单将名单中的任何状态更改打印到标准输出。普通客户端将使用类似的代码来更新名单UI以及更改的信息。
Roster roster = Roster.getInstanceFor(con);roster.addRosterListener(new RosterListener() { // Ignored events public void entriesAdded(Collectionaddresses) {} public void entriesDeleted(Collection addresses) {} public void entriesUpdated(Collection addresses) {} public void presenceChanged(Presence presence) { System.out.println("Presence changed: " + presence.getFrom() + " " + presence); }});
将名称添加到名册中
Rosters和presence使用基于权限的模型,用户必须在将其添加到其他人的名单之前提供权限。这可以确保只有经过批准的用户才能查看其在线信息,从而保护用户的隐私。因此,当您添加新的名册条目时,它将处于暂挂状态,直到其他用户接受您的请求。
如果其他用户请求在线订阅,以便他们可以将您添加到他们的名单中,则必须接受或拒绝该请求。Smack以三种方式之一处理在线订阅请求:
- 自动接受所有在线订阅请求。
- 自动拒绝所有在线订阅请求。
- 手动处理在线订阅请求。可以使用该
Roster.setSubscriptionMode(Roster.SubscriptionMode)
方法设置模式。简单客户端通常使用其中一种自动订阅模式,而功能齐全的客户端应手动处理订阅请求,并让最终用户接受或拒绝每个请求。如果使用手动模式,则应注册PacketListener以侦听类型为的Presence数据包Presence.Type.subscribe
。
版权所有(C)Jive Software 2002-2008