2011-05-19 170 views
2

我正在爲Android和iPhone使用XMPP客戶端。我已經能夠連接到服務器並獲取消息。如何檢查客戶端是否連接到XMPP服務器

但客戶端在幾分鐘後即斷開與XMPP服務器的連接。 IOS XMPP框架包含一個委託方法,用於指示客戶端是否連接到服務器。如果連接沒有斷開連接,那麼我們可以使用委託方法重新連接。我在Android客戶端(我正在使用aSmack庫)中使用以下代碼來檢查連接是否存在。但是這似乎不起作用。

public void recieveMessage() 
{ 

      Log.e("xmppclient","will receive messages"); 
      PacketFilter filter = new MessageTypeFilter(Message.Type.chat); 
      connection.addPacketListener(new PacketListener() { 

      public void processPacket(Packet packet) { 
       if(connection != null && connection.isConnected()) 
       { 
        Message message = (Message) packet; 
        if (message.getBody() != null) 
         { 
        fromName = StringUtils.parseBareAddress(message.getFrom()); 
        String messageBody=message.getBody(); 
        Log.e("Message", messageBody); 
        Intent i = new Intent(NEW_MESSAGE); 
        i.putExtra("username", StringUtils.parseBareAddress(message.getFrom())); 
        i.putExtra("message", message.getBody()); 
        sendBroadcast(i); 
         } 
        else 
        { 

         connectToXmpp(); 
        } 
       } 

      } 

      } 
    ,filter); 
    } 

connectToXMPP()是打開新連接的方法。

是否有任何其他方式來檢查連接,並在連接結束後立即重新連接到XMPP ... ???

+0

請先檢查你剛纔提到你的問題「如何檢查客戶端是否爲服務器...」,你有什麼想說?客戶端或服務器已連接? – 2011-05-19 13:10:04

+1

更改了...感謝您指出...... !!! – 2011-05-19 13:28:32

回答

2

您應該可以通過在您的連接上使用ConnectionListener來完成此操作。這將允許您檢測何時斷開連接並嘗試正確處理它。

上面的代碼幾乎不應該碰到else條件,因爲連接必須已經打開才能接收到您正在處理的數據包。

+0

你能用一個例子來解釋一下嗎? – 2013-08-28 15:39:27

+1

@MarkMolina下面增加了一個例子。 – 2013-09-02 00:28:33

+0

試試這個:http://xmpp-tutorials.blogspot.com.br/ – Richard 2014-06-30 23:27:09

0

確保在重新連接時始終檢查conflict錯誤。當另一個客戶端使用與當前會話相同的完整JID(local @ domain/resource)登錄時,會發生這種情況。你會得到這樣的:

<stream:error> 
    <conflict xmlns='urn:ietf:params:xml:ns:xmpp-streams'/> 
</stream:error> 

決不 autoReconnect的時候,這是錯誤,否則你會寫了可怕的「決鬥資源」錯誤。再次。和其他任何XMPP客戶端作者一樣。

2

我自己經歷過這個問題,現在我已經解決了我的問題,它的工作方式非常正確。

這裏是解決方案: -

  1. 轉到您的Openfire服務器。登錄它。
  2. 現在打開它後,單擊SERVER選項卡。
  3. 打開服務器選項卡後打開子選項卡 - 服務器設置
  4. 打開服務器設置後,單擊左側的服務器到服務器設置。
  5. 現在在這裏是第二個選項 - IDLE CONNECTION SETTINGS。
  6. 設置它 - 從不關閉空閒連接。

您的問題將得到解決。

+0

服務器到服務器設置與客戶端到服務器連接無關。 – Robin 2013-09-04 18:52:39

+0

@Robin謝謝羅賓 – 2013-09-06 06:43:11

5

正如上文所述,您需要連接的連接監聽器,如下:

Connection connection = (Connection)params[0]; 
connection.connect(); 

connection.addPacketListener(new PacketListener() { 

           @Override 
           public void processPacket(Packet packet) { 
            System.out.println("Received message"); 
           } 
          }, new PacketFilter() { 

           @Override 
           public boolean accept(Packet packet) { 
            System.out.println("Received message"); 
            return true; 
           } 
          }); 

connection.addConnectionListener(new ConnectionListener() { 
    @Override 
    public void connectionClosed() { 
     System.out.println("uhoh"); 
    } 

    @Override 
    public void connectionClosedOnError(Exception e) { 
     System.out.println("uhoh"); 
    } 

    @Override 
    public void reconnectingIn(int i) { 
     if(i < 4){ 
      //TODO notify 
     } 
    } 

    @Override 
    public void reconnectionSuccessful() { 
     System.out.println("uhoh"); 
    } 

    @Override 
    public void reconnectionFailed(Exception e) { 
     System.out.println("uhoh"); 
    } 
}); 

connection.login("test2", "test"); 
相關問題