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

        }
    });
}

私はこれで立ち往生しており、コードをサーブレットで動作させることができません..誰か助けてもらえますか??

4

3 に答える 3

1

ユーザーのプレゼンスを取得できるように、 presenceChangedメソッドをオーバーライドする必要があるRosterListenerインターフェイスを実装する必要があります。

わたしにはできる。

GTalkの名簿を取得すると、すべてのステータスが利用不可になります。

しかし、しばらくすると、それらのプレゼンスが変更され、RosterListnerのpresenceChangedメソッドからプレゼンスを取得できますが、そのためには、RosterListenerのpresenceChnagedメソッドを実装する必要があります。

そして、それはJava EE、Android、そしてWAPでうまく機能します。

于 2011-05-24T10:14:32.550 に答える