[英]Does Smack work well in Java EE
Smack function 在 Java EE 中是否正确? 我遇到了存在问题。 我通过 doPost 方法从登录表单中获取凭据..我可以成功进行身份验证以及 connection.getRoster() 也可以工作。接下来我只想显示在线的用户,这样当我得到用户的存在时,存在object 为所有用户存储默认值“不可用”,即使他们可用!
整个聊天应用程序在正常的 java class 中没有任何变化。
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
}
});
}
我被困住了,无法让代码与 servlets 一起工作。谁能帮帮我?
您必须实现RosterListener接口,在该接口中您必须覆盖presentChanged方法,这样您才能获得用户的存在。
这个对我有用。
当您获得 GTalk 的花名册时,所有状态都将显示为不可用。
但是一段时间后,他们的存在发生变化,并且可以从 RosterListner 中的 presentChanged 方法获取存在,但为此您必须实现 RosterListener 的 presenceChnaged 方法。
而且它在 Java EE、Android 以及 WAP 中运行良好。
Smack 是否会在 Java EE 内部工作,是的,不是的。 Smack 将在 web 容器内工作,但由于它创建自己的线程,因此无法在 EJB 容器内工作。 所以它会根据你在哪里运行。
要了解您的一些问题,您必须了解 servlet 中对象的生命周期与每个请求的请求/响应周期相关联。 这与标准的 java 应用程序不同,因为您可以控制它们的生命周期,所以对象通常会根据您的需要而存在。
例如,在您显示的代码中,您为每个请求创建连接(我假设,因为并未显示所有代码)。 因此,针对该连接注册侦听器将毫无意义,因为一旦您离开该方法,它就会从 scope 传递出去,并最终被垃圾收集。 您必须维护 servlet 请求的 scope 之外的连接才能正常工作,否则您将打开和关闭每个请求的连接。
XMPP 本质上是完全异步的,而 servlet 请求是同步的。 您必须付出一些努力才能使它们一起工作,所以不要期望在独立应用程序中工作的代码可以在这种环境中简单地工作。
Smack function 在 Java EE 中是否正确? 我遇到了存在问题。 我通过 doPost 方法从登录表单中获取凭据..我可以成功进行身份验证以及 connection.getRoster() 也可以工作。接下来我只想显示在线的用户,这样当我得到用户的存在时,存在object 为所有用户存储默认值“不可用”,即使他们可用! 这是我的代码
<%
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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.