创建基于 Ajax 的 IM 客户端(8)处理 roster
- UID
- 1066743
|
创建基于 Ajax 的 IM 客户端(8)处理 roster
处理 roster每个即时消息平台都有一些 “好友列表”,即您经常与之交谈的用户列表。它通常出现在单独的窗口或邻近当前对话。借助 roster 可以更方便地发起对话,而且也可以让即时消息客户端得以告诉您谁在线谁没有在线。
在本教程中,您可以使用 roster 来协助管理对话。其思想是 roster 在右侧栏显示,而通过单击想要与之交谈的对象的名字能够在对话间切换。
向 roster 添加第一步是构建 roster。如果使用的是传统的 IM 客户端,这将比较简单;通常会有某些按钮,可以用来添加当前聊天、作为好友参与。
在本例中,必须使用 bot 向用户的 roster 中添加。所幸的是,这个过程十分简单。首先,向 bot 本身添加此功能,方法是对 ChatBot.java 做如下更改(参见清单 19):
清单 19. 向 roster 添加1
2
3
4
5
6
7
8
9
10
11
| ....
public void addToRoster(String targetUser, String targetName){
Roster roster = conn.getRoster();
try {
roster.createEntry(targetUser, targetName, null);
createConversation(targetUser);
} catch (XMPPException e){
e.printStackTrace();
}
}
....
|
此方法接受想要添加到 roster 的用户地址和名字。请注意重要的是地址;名字可用作 “显示名称”,正如本教程中所做的那样。
首先,让用户的 roster 登录到当前连接(我假定这就是 bot 帐号)。有了 roster,所需做的就只是创建新的条目。
请注意,之后,为这个新添加的条目创建了一个对话。严格来讲,在本教程中这不是必需的,因为在应用程序运行时,并没有向 roster 中动态添加用户,我之所以这么做是为了举例说明。
现在需要向 ChatServlet 添加此项功能(参见清单 20):
清单 20. 向 servlet 添加 roster 功能1
2
3
4
5
6
7
8
9
10
11
12
| ....
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
if (request.getParameter("addToRoster") != null){
bot.addToRoster(
request.getParameter("addToRoster").toString(),
request.getParameter("rosterName").toString());
}
....
|
这里所做的是检测想要向 roster 中添加名称的用户并为 bot 提供合适的信息。通过调用如下所示的 URL 可以向 roster 添加想要与之交流的任意多的好友:
1
2
3
| <a href="http://yourserver/proj/ChatServlet?addToRoster=myfriend@myserver.net&
rosterName=My+Friend">http://yourserver/proj/ChatServlet?addToRoster=
myfriend@myserver.net&rosterName=My+Friend</a>
|
现在需要将 roster 信息取回。
获取 roster向 roster 添加了好友之后,需要查看谁在其列。这是聊天 Web 页面所需的。首先向 ChatBot 类添加新方法(参见清单 21):
清单 21. 获取 roster1
2
3
4
5
6
7
8
9
10
11
12
| ....
public String getRoster(){
Roster roster = conn.getRoster();
String returnStr = "";
Iterator<RosterEntry> iter = roster.getEntries().iterator();
while (iter.hasNext()) {
RosterEntry entry = (RosterEntry) iter.next();
returnStr = returnStr + entry.getName() + "<br />";
}
return returnStr;
}
....
|
这里仍然还是为当前连接检索 roster。getEntries() 方法返回所有条目的 Enumeration,使用 Iterator 可以访问到此 Enumeration。对于每个条目,您都会向 returnStr 变量添加名称和一个分行符以便将它输出到 Web 时能正确显示。
当然,需要能够从 servlet 检索到此 roster(参见清单 22):
清单 22. 从 servlet 检索此 roster1
2
3
4
5
6
7
8
9
10
| ....
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
....
if (request.getParameter("getRoster") != null){
response.getWriter().println(bot.getRoster());
}
....
|
若要测试,可以从浏览器发起对它的请求。getRoster 参数的值为多少并不重要;但它必须存在。
从 roster 中删除为了全面起见,需要了解如何从 roster 删除某人(比如,不再想与这些人交谈),如清单 23 所示:
清单 23. 从 roster 删除某人1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| ....
public void removeFromRoster(String targetUser){
Roster roster = conn.getRoster();
try {
RosterEntry entry = roster.getEntry(targetUser);
roster.removeEntry(entry);
chatSessions.remove(targetUser);
chatQueues.remove(targetUser);
} catch (XMPPException e){
e.printStackTrace();
}
}
....
|
这里最重要的是一旦您获得了 Roster 对象本身,需要首先找到 RosterEntry,然后才能删除它。否则,删除的只是此用户的对话。同样,如果在应用程序运行期间,如果不是动态添加和删除 roster 条目,这也不是必需的。
当然,还需要向 servlet 添加此功能(参见清单 24):
清单 24. 从 servlet 删除 roster 条目1
2
3
4
5
6
7
8
9
10
| ....
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
if (request.getParameter("removeFromRoster") != null){
bot.removeFromRoster(
request.getParameter("removeFromRoster").toString());
}
....
|
在添加用户的情况下,参数的值很重要,应该包含所针对的用户的地址。
现在让我们向此页面添加 roster。 |
|
|
|
|
|