首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

创建基于 Ajax 的 IM 客户端(8)处理 roster

创建基于 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. 获取 roster
1
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 检索此 roster
1
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。
返回列表