#java #jakarta-ee #smack #google-talk
#java #джакарта-ee #smack #google-talk
Вопрос:
Правильно ли функционирует Smack в Java EE?? У меня возникли проблемы с присутствием. Я получаю учетные данные из формы входа с помощью метода doPost..Я могу успешно выполнить аутентификацию, а также подключение.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
}
});
}
Я застрял с этим и не могу заставить код работать с сервлетами..Кто-нибудь может мне помочь??
Комментарии:
1. Да, smack хорошо работает для j2ee, по крайней мере, для меня.
2. опубликуйте код. Это не имеет ничего общего с java-ee
3. @Jigar Joshi — Отредактировал мой вопрос.. Вы можете взглянуть на это
4. @новичок: видите ли вы какие-либо изменения присутствия в
presenceChanged(..)...
методе? Печатает ли он измененное присутствие после входа в систему?5. Нет, я не могу… Функция presenceChanged() не работает…. Я проверил с помощью ToXML (), что ему присвоено значение «недоступно» для всех пользователей, независимо от статуса или изменения статуса. В целом presence вообще не работает
Ответ №1:
Будет ли Smack работать внутри Java EE, да и нет. Smack будет работать внутри веб-контейнера, но поскольку он создает свои собственные потоки, он не будет работать внутри контейнера EJB. Таким образом, он будет работать в зависимости от того, где вы его запускаете.
Чтобы разобраться в некоторых ваших проблемах, вы должны понимать, что жизненный цикл ваших объектов в сервлете привязан к циклу запроса / ответа каждого запроса. Это не то же самое, что стандартное приложение Java, где объекты обычно будут жить столько, сколько вам нужно, поскольку вы контролируете их жизненный цикл.
Например, в показанном вами коде вы создаете соединение для каждого запроса (я предполагаю, поскольку показан не весь код). Поэтому регистрация прослушивателей для этого соединения будет бессмысленной, поскольку оно выйдет из области видимости, как только вы покинете метод, и в конечном итоге будет собран мусор. Чтобы это сработало, вам придется поддерживать соединения вне области запросов сервлета, иначе вы будете открывать и закрывать соединения для каждого запроса.
XMPP по своей природе полностью асинхронен, тогда как запросы сервлетов синхронны. Вам придется приложить некоторые усилия, чтобы заставить их работать вместе, поэтому не ожидайте, что код, который работает в автономном приложении, будет просто работать в этой среде.
Комментарии:
1. @Robin .. можете ли вы предложить обходной путь для этого?? Что можно сделать??
Ответ №2:
Вы должны реализовать интерфейс RosterListener, в котором вы должны переопределить метод presenceChanged, чтобы вы могли получить информацию о присутствии пользователей.
У меня это работает.
При получении списков GTalk все они будут иметь статус недоступных.
Но через некоторое время их присутствие изменяется, и присутствие может быть получено из метода presenceChanged в RosterListner, но для этого вы должны реализовать метод presenceChanged RosterListener в RosterListener.
И да, он хорошо работает в Java EE, Android, а также WAP.
Комментарии:
1. @новичок: изначально вы станете недоступны для всех пользователей, поэтому просто просмотрите приведенный выше ответ, который я опубликовал, и ваш код будет работать.
2. @Ankit-Я использую RosterListener в приведенном выше коде… Похоже, что все присутствие не работает…
Ответ №3:
Правильно ли функционирует Smack в Java EE?? У меня возникли проблемы с присутствием. Я получаю учетные данные из формы входа с помощью метода doPost..Я могу успешно выполнить аутентификацию, а также подключение.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>