2015-04-10 2 views
2

Я использую aSmack и Openfire для своего приложения. И Spark для тестирования.Отключение Android-XMPP

Я пишу код подключения и широковещательный приемник, который прослушивает состояние сети в службе STICKY.

Когда я выключаю свой Wi-Fi, интернет уходит, но Spark все еще показывает мне «Доступно», и через 3-4 минуты он превращает мой статус в «недоступный».

Я пробовал xmppConnection.disconnect() и Presence.Type.unavailable. Но никто из них не работает на меня.

Как я могу немедленно отключить сервер XMPP/отправить сообщение «Недоступно» после отключения интернет-соединения клиента?

Это мой код:

// Connect XMPP Server 
public void connectXMPPServer() { 

    Thread t = new Thread(new Runnable() { 

     @Override 
     public void run() { 

      // Create a connection 
      ConnectionConfiguration connConfig = new ConnectionConfiguration(
        HOST, PORT, SERVICE); 
      connConfig.setReconnectionAllowed(true); 

      xmppConnection = new XMPPConnection(connConfig); 

      try { 

       xmppConnection.connect(); 
       Log.i("XMPPChatDemoActivity", "Connected to " 
         + xmppConnection.getHost()); 
      } catch (XMPPException ex) { 

       Log.e("XMPPChatDemoActivity", "Failed to connect to " 
         + xmppConnection.getHost()); 
       Log.e("XMPPChatDemoActivity", ex.toString()); 
      } 

      try { 

       if (xmppConnection.isConnected()) { 

        xmppConnection.login(USERNAME, PASSWORD); 
        Log.i("XMPPChatDemoActivity", "Logged in as " 
          + xmppConnection.getUser()); 

        Presence presence = new Presence(
          Presence.Type.available); 
        xmppConnection.sendPacket(presence); 
       } 
      } catch (XMPPException ex) { 

       Log.e("XMPPChatDemoActivity", "Failed to log in as " 
         + USERNAME); 
       Log.e("XMPPChatDemoActivity", ex.toString()); 
      } 
     } 
    }); 
    t.start(); 
} 

// Broadcast receiver; listens to network state 
public BroadcastReceiver networkStateReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     try { 

      if (isNetworkOn()) { 

       Log.i("BackgroundService-BroadcastReceiver", 
         "Network is on"); 
       connectXMPPServer(); 
      } else if (!isNetworkOn()) { 

       Log.i("BackgroundService-BroadcastReceiver", 
         "Network is off"); 
       Presence presence = new Presence(Presence.Type.unavailable); 
       xmppConnection.sendPacket(presence); 
       xmppConnection.disconnect(); 
      } 
     } catch (Exception e) { 

      Log.e("BackgroundService-networkStateReceiver", e.toString()); 
     } 
    } 
}; 

// Returns network state 
public boolean isNetworkOn() { 

    ConnectivityManager connMngr = (ConnectivityManager) getApplicationContext() 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = connMngr.getActiveNetworkInfo(); 
    return (netInfo != null && netInfo.isConnected()); 
} 
+2

После подключения к Интернету ваши пакеты не доставляются/доходят до сервера, поэтому он постоянно показывает присутствие на сервере. Используйте ping-pong для сквозного соединения, отправляйте ping через 30 секунд непрерывно клиенту с сервера. если ping не получает от сервера, то установите присутствие недоступно этому пользователю –

ответ

0

Вы должны добавить ConnectionListener, которая будет вызвана, как только обнаруживается падение соединения. Затем вы можете обновить свое состояние в пользовательском интерфейсе.

Отправка присутствия предназначена для того, чтобы другие знали ваше состояние, которое вы, очевидно, не можете сделать, если у вас нет связи. Сервер будет делать это для вас, когда он обнаружит отключение.

+1

Спасибо за ваш ответ. Я хочу знать, что я могу сделать с сервером, чтобы он показывал мне «недоступный», как только соединение с клиентом будет отключено. – Sushant

+0

@ У вас уже есть ответ или решение проблемы? – Pierre