2011-05-24 34 views
0

Smack在Java EE中的功能是否正常?我遇到了问题。 我通过doPost方法从登录表单中获取凭据。我可以成功进行身份验证,并且connection.getRoster()也可以正常工作。接下来,我只想显示在线用户,因此当我得到用户时,即使存在对象可用,存在对象也会为所有用户存储默认值“不可用”!Smack在Java EE中的工作良好

整个聊天应用工程没有瑕疵在一个普通的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 

     } 
    }); 
} 

我坚持这一点,并没有能够得到的代码servlets..Can人的工作帮助我??

+0

是咂嘴可以很好地用于J2EE至少对我来说。 – 2011-05-24 10:13:31

+1

发布代码。它与java-ee无关 – 2011-05-24 10:17:44

+0

@Jigar Joshi编辑了我的问题。你可以看看它 – newbie 2011-05-24 10:26:32

回答

1

你要实现你必须重写presenceChanged在方法,你可以得到用户的存在的RosterListener接口。

它适用于我。

当你获得GTalk的名单时,所有的状态都将不可用。

但是在某种程度上它们的存在发生变化并且存在可以从RosterListner中的presenceChanged方法获得,但是您必须实现RosterListener的presenceChnaged方法。

而且它适用于Java EE,Android以及WAP。

+0

@ Ankit-我在初始化它的用户时遇到问题.. – newbie 2011-05-24 10:27:06

+0

@newbie:最初,您将无法使用所有用户,只需查看我发布的上述答案,您的代码即可运行。 – Ankit 2011-05-24 10:31:10

+0

@ Ankit-我在上面的代码中使用了RosterListener ...整个存在似乎不起作用... – newbie 2011-05-24 10:34:36

1

Smack是否会在Java EE中工作,是和否。 Smack将在Web容器内部工作,但由于它创建了自己的线程,它不会在EJB容器内工作。所以它将取决于你在哪里运行它。

为了理解您的一些问题,您必须明白,servlet中对象的生命周期与每个请求的请求/响应周期相关联。这与标准的Java应用程序不同,因为您控制它们的生命周期,对象通常只要您需要它们即可生活。

例如,在您显示的代码中,您为每个请求创建连接(我假设,因为并非所有代码都显示)。因此,向这个连接注册监听器将毫无意义,因为一旦离开该方法它就会超出范围,并最终得到垃圾回收。您将不得不维持servlet请求范围之外的连接,否则您将打开和关闭每个请求的连接。

XMPP本质上是完全异步的,而servlet请求是同步的。你必须付出一些努力才能使它们一起工作,所以不要指望在独立应用程序中运行的代码只是在这个环境中工作。

+0

@ Robin.can你可以为此提出一个解决方法??可以做些什么?请给我, – newbie 2011-05-30 04:10:06

-2

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> 
+0

,给你的代码添加一些解释。 – 2015-01-16 13:18:03