Хорошо ли работает Smack в Java EE - PullRequest
0 голосов
/ 24 мая 2011

Правильно ли работает 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

        }
    });
}

Iя застрял с этим и не смог получить код, работающий с сервлетами .. Может кто-нибудь помочь мне ??

Ответы [ 3 ]

1 голос
/ 27 мая 2011

Будет ли Smack работать внутри Java EE, да и нет.Smack будет работать внутри веб-контейнера, но поскольку он создает свои собственные потоки, он НЕ будет работать внутри EJB-контейнера.Так что он будет работать в зависимости от того, где вы его выполняете.

Чтобы понять некоторые из ваших проблем, вы должны понимать, что жизненный цикл ваших объектов в сервлете связан с циклом запрос / ответ каждого запроса.Это не то же самое, что стандартное Java-приложение, в котором объекты обычно живут столько времени, сколько вам нужно, поскольку вы контролируете их жизненный цикл.

Например, в показанном вами коде вы создаете соединениедля каждого запроса (полагаю, так как не весь код показан).Поэтому регистрация прослушивателей для этого соединения будет бессмысленной, поскольку она выйдет из области видимости, как только вы выйдете из метода, и в конечном итоге соберет мусор.Чтобы это работало, вам нужно будет поддерживать соединения вне области запросов сервлета, в противном случае вы будете открывать и закрывать соединения для каждого запроса.

XMPP по своей природе является полностью асинхронным, тогда как запросы сервлетов являются синхронными.Вы должны приложить некоторые усилия, чтобы заставить их работать вместе, поэтому не ожидайте, что код, работающий в автономном приложении, просто будет работать в этой среде.

1 голос
/ 24 мая 2011

Вам необходимо реализовать интерфейс RosterListener , в котором необходимо переопределить метод senceChanged , чтобы можно было получать присутствие пользователей.

Это работает для меня.

Когда вы получаете списки GTalk, все они будут иметь статус недоступных.

Но через некоторое время их присутствие меняется, и присутствие можно получить с помощью методаsenceChanged в RosterListner, но для этого вам необходимо реализовать методsenceChnaged из RosterListener.

И это хорошо работает в Java EE, Android и WAP.

0 голосов
/ 16 января 2015

Правильно ли работает 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>
...