Как сохранить стабильное соединение XMPP на Android с (a) привкус?

Я использую библиотеку asmackandroid-7-beem для Android. У меня работает фоновый сервис, например, мое приложение остается в живых. Но рано или поздно XMPP-соединение умирает без какого-либо уведомления. Сервер говорит, что клиент все еще в сети, но пакеты не отправляются и не принимаются.

Например, клиент не получает никаких пакетов присутствия, когда другие клиенты имеют новое присутствие. У меня XMPPConnection в качестве атрибута моего основного класса Application.
Я установил ConnectionConfiguration config.setReconnectionAllowed(true) до того, как было установлено соединение.
Но пересоединения не бывает. XMPPConnection connection.isConnected() возвращает true.

Таким образом, клиент не знает, что соединение действительно потеряно.

Есть ли способ сохранить связь живым?

Solutions Collecting From Web of "Как сохранить стабильное соединение XMPP на Android с (a) привкус?"

При использовании asmack добавьте такой код в ваше приложение, чтобы заставить Dalvik загрузить класс ReconnectionManager и запустить его статический блок инициализации:

 static { try { Class.forName("org.jivesoftware.smack.ReconnectionManager"); } catch (ClassNotFoundException ex) { // problem loading reconnection manager } } 

На самом деле нет проблем с менеджером Reconnection. Сначала вам нужно добавить прослушиватель соединений в диспетчер подключений.

 connection.addConnectionListener(new ConnectionListener() { @Override public void reconnectionSuccessful() { Log.i("","Successfully reconnected to the XMPP server."); } @Override public void reconnectionFailed(Exception arg0) { Log.i("","Failed to reconnect to the XMPP server."); } @Override public void reconnectingIn(int seconds) { Log.i("","Reconnecting in " + seconds + " seconds."); } @Override public void connectionClosedOnError(Exception arg0) { Log.i("","Connection to XMPP server was lost."); } @Override public void connectionClosed() { Log.i("","XMPP connection was closed."); } }); 

Если возникла какая-либо ошибка, соединениеClosedOnError (Exception arg0) будет автоматически вызываться при закрытии соединения

  public void connectionClosed() { Log.i("","XMPP connection was closed."); //You can manually call reconnection code if you want to reconnect on any connection close } 

Затем проверьте, что это вызовет метод reconnectingin () и попытается снова подключиться.

Надеюсь, это поможет тебе.

Используйте ниже код для проверки соединения PingManager pingManager = PingManager.getInstanceFor(connection); pingManager.setPingInterval(5000); PingManager pingManager = PingManager.getInstanceFor(connection); pingManager.setPingInterval(5000);

Add listner для обработки ошибок ping для обработки соединения подключен или нет, потому что метод isConnected не является надежным для проверки состояния соединения.

pingManager.registerPingFailedListener(PingFailedListener);

Для подключения к мобильной сети очень большая проблема, поэтому вам нужно проверить сетевое подключение для мобильных устройств с помощью широковещательного приемника и при повторном подключении данных, вы можете использовать метод pingMyServer для проверки соединения вживую или нет, если вы получаете ответ ping с сервера, означает, что соединение живое В противном случае при отказе ping вы можете повторно подключить соединение вручную.

У меня такая же проблема, за исключением того, что моя программа запускается на стороне JVM на стороне сервера.
В первую очередь я использовал smack 4.0. Затем я обновился до 4.1, но проблема все же произошла. Наконец, я нашел модуль конфигурации: PingManager
После этого возникла такая ситуация.

  connection = new XMPPTCPConnection(config); PingManager pingManager = PingManager.getInstanceFor(connection); pingManager.setPingInterval(300); // seconds 

В Smack 4.1 я использую ServerPingWithAlarmManager . Вы можете найти более подробную информацию о сохранении соединения в блоге ramzandroid здесь .