2011-05-24 67 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