如何解决Smack在Java EE中是否工作良好?
| 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
}
});
}
我对此感到困惑,无法使代码与servlet一起使用。有人可以帮我吗?
解决方法
Smack是否可以在Java EE中工作,是,不是。
Smack将在Web容器内部工作,但是由于它创建了自己的线程,因此将无法在EJB容器内部工作。因此,它将根据您在哪里运行而工作。
要了解您的某些问题,您必须了解Servlet中对象的生命周期与每个请求的请求/响应周期有关。这与标准的Java应用程序不同,在标准的Java应用程序中,对象通常只要您需要就可以生存,因为您可以控制它们的生命周期。
例如,在显示的代码中,您将为每个请求创建连接(我假设,因为未显示所有代码)。因此,针对该连接注册侦听器将毫无意义,因为一旦离开该方法,该连接将超出范围,并最终导致垃圾回收。您必须将连接保持在servlet请求范围之外,以使其正常工作,否则,您将为每个请求打开和关闭连接。
XMPP本质上是完全异步的,而Servlet请求是同步的。您必须付出一定的努力才能使它们协同工作,所以不要期望在独立应用程序中工作的代码可以在这种环境下简单地工作。
,您必须实现RosterListener接口,在该接口中您必须重写presentChanged方法,这样才能获得用户的状态。
这个对我有用。
当您获得GTalk名单时,所有状态都将不可用。
但是经过一段时间后,它们的状态会发生变化,并且可以从RosterListner中的presenceChanged方法获取状态,但是为此您必须实现RosterListener的presentationChnaged方法。
而且,它在Java EE,Android和WAP中都可以很好地工作。
,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>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。