0

Smack 在 Java EE 中是否正常运行?我遇到了存在问题。我通过 doPost 方法从登录表单中获取凭据..我可以成功地进行身份验证以及 connection.getRoster() 也可以工作。接下来我只想显示在线的用户,这样当我得到用户的存在时,存在对象存储所有用户的默认值“不可用”,即使他们可用!

整个聊天应用程序在普通的 java 类中没有任何缺陷地工作,没有任何改变..

            String userName = request.getParameter("username");
    String password = request.getParameter("password");

        HttpSession session=request.getSession();
        session.setAttribute("username", userName);

    SmackAPIGtalkServlet gtalk = new SmackAPIGtalkServlet();

    ConnectionConfiguration config = new ConnectionConfiguration(
            "talk.google.com", 5222, "gmail.com");
    connection = new XMPPConnection(config);
    config.setSASLAuthenticationEnabled(false);
    try {
        connection.connect();
    } catch (XMPPException e) {
        e.printStackTrace();
    }
    try {
        connection.login(userName, password);
    } catch (XMPPException e) {
        e.printStackTrace();
    }
    System.out.println(connection.isAuthenticated());
    boolean status = connection.isAuthenticated();
    if (status == true) {
        gtalk.displayOnlineBuddyList();
        response.sendRedirect("Roster.jsp");

    }
    else
    {
        response.sendRedirect("Failed.jsp");
    }
}

public void displayOnlineBuddyList() {
    Roster roster = connection.getRoster();
    Collection<RosterEntry> entries = roster.getEntries();
    int count1 = 0;
    int count2 = 0;
    for (RosterEntry r : entries) {
        Presence presence = roster.getPresence(r.getUser());
        if (presence.getType() == Presence.Type.unavailable) {
            // System.out.println(user + "is offline");
            count1++;
        } else {
            System.out.println(name+user + "is online");
            count2++;
        }
    }
    roster.addRosterListener(new RosterListener() {
        // Ignored events public void entriesAdded(Collection<String>
        // addresses) {}
        public void entriesDeleted(Collection<String> addresses) {
        }

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

        public void presenceChanged(Presence presence) {
            System.out.println("Presence changed: " + presence.getFrom()
                    + " " + presence);
        }

        @Override
        public void entriesAdded(Collection<String> arg0) {
            // TODO Auto-generated method stub

        }
    });
}

我被这个困住了,无法让代码与 servlet 一起工作。谁能帮帮我吗?

4

3 回答 3

1

您必须实现RosterListener接口,在该接口中您必须覆盖presentChanged方法,这样您才能获得用户的存在。

这个对我有用。

当您获得 GTalk 的花名册时,所有状态都将显示为不可用。

但是一段时间后,他们的存在发生变化,并且可以从 RosterListner 中的 presentChanged 方法获取存在,但为此您必须实现 RosterListener 的 presenceChnaged 方法。

而且它在 Java EE、Android 和 WAP 中运行良好。

于 2011-05-24T10:14:32.550 回答
1

Smack 是否可以在 Java EE 内部工作,是的,不是的。Smack 将在 Web 容器内工作,但由于它创建自己的线程,因此它不会在 EJB 容器内工作。所以它会根据你在哪里运行。

要了解您的一些问题,您必须了解 servlet 中对象的生命周期与每个请求的请求/响应周期相关联。这与标准的 Java 应用程序不同,因为您控制着它们的生命周期,所以对象通常会在您需要它们时一直存在。

例如,在您显示的代码中,您为每个请求创建连接(我假设,因为并未显示所有代码)。因此,针对该连接注册侦听器将毫无意义,因为一旦您离开该方法,它将超出范围,并最终被垃圾收集。您必须维护 servlet 请求范围之外的连接才能使其正常工作,否则您将为每个请求打开和关闭连接。

XMPP 本质上是完全异步的,而 servlet 请求是同步的。您必须付出一些努力才能使它们一起工作,所以不要期望在独立应用程序中工作的代码可以在这种环境中简单地工作。

于 2011-05-27T19:24:15.460 回答
-2

Smack 在 Java EE 中是否正常运行?我遇到了存在问题。我通过 doPost 方法从登录表单中获取凭据..我可以成功进行身份验证以及 connection.getRoster() 也可以工作。接下来我只想显示在线的用户,这样当我得到用户的存在时,存在对象存储所有用户的默认值“不可用”,即使他们可用!这是我的代码

<%
 Roster rst = roster;
 rst.addRosterListener(new RosterListener() {
public void entriesAdded(final Collection args) {}

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

public void entriesUpdated(final Collection<String> addresses) {}

public void presenceChanged(final Presence presence) {
    final Presence prsence1 = presence;
    prsenceChanged(prsence1);
    if (prsence1.isAvailable()) {
        System.out.println("Is Available: " + presence.isAvailable());
    } 


}
});

 %> 



<%!void prsenceChanged(Presence presence){ if(null != presence){%>
<script language="javascript"> 
    alert("hai");   

</script>
于 2015-01-16T12:58:57.927 回答