Android - Как сохранить связь с сервером в течение длительного времени

Я написал приложение для чата для Android, используя SocketChannel. Он успешно подключается к серверу, и все функции работают. Но спустя долгое время после входа в систему (около 2-3 часов) я снова пытаюсь отправить сообщение в чат, и это не удается. В файле журнала SocketChannel селектор все еще открыт и подключается к серверу, сообщение уже пишется успешно. В чем проблема? Что мне не хватает?

Заранее спасибо за помощь.


person Sephiroth    schedule 25.03.2012    source источник
comment
У меня такая же проблема, и я не нашел решения. Я ищу уже 6 месяцев.   -  person Joel    schedule 25.03.2012


Ответы (2)


если вы хотите создать чат для Android или что-то еще с push-уведомлением с сервера, попробуйте MQTT

http://tokudu.com/2010/how-to-implement-push-notifications-for-android/

это очень крутая вещь, вы только взгляните на нее :-)

person Boe-Dev    schedule 25.03.2012
comment
Спасибо за ответ! В этом руководстве используется Socket, а не SocketChannel. Поэтому я думаю, что это больше подходит для push-уведомлений, чем для чата. Оба они используют бесконечный цикл для получения сообщения от сервера, но с SocketChannel и селектором мы можем подождать, пока не наступит беспорядок, прежде чем делать следующий цикл - person Sephiroth; 25.03.2012

У меня была такая же проблема с SocketChannel. Я использовал библиотеку на основе SocketChannel для подключения к веб-сокету из приложения andoird (библиотека веб-сокет Autobahn). Я могу успешно подключиться к веб-сокету и могу отправлять/получать сообщения через веб-сокет. Но через некоторое время (может быть, через 30 минут, 1 или 2 часа) соединение с веб-сокетом зависает. По вашему сценарию в журналах кажется, что соединение сокета все еще открыто и подключается к серверу, сообщение уже пишется успешно. Но сервер не будет получать сообщения.

В моем сценарии проблема не в SocketChannel. Проблема в тайм-ауте TCP. Чтобы поддерживать соединение, я отправляю периодические пинг-сообщения с сервера на клиент. Веб-сокет по умолчанию поддерживает эти сообщения, вызывающие сообщения PING/PONG. Это сообщение ping необходимо периодически отправлять клиентам, чтобы поддерживать соединение. Когда сообщение ping получено, клиент автоматически отвечает серверу сообщением PONG. Используя этот подход, я смог сохранить соединение сокета в течение длительного времени.

Подробнее об этом подходе Решение для зависания веб-сокета, Websockets. Потеря Интернета, сообщения проверки активности, архитектура приложения и т. д., протокол websocket и сообщения ping/pong

Надеюсь, это поможет вам (даже если вы не используете веб-сокет). Подход может быть таким же, как в веб-сокете, так и в вашем приложении чата.

person eranga    schedule 14.02.2014