@MrStuff88

Как проверить Socket соединение в Android?

Добрый день. Стоит задача сделать Android приложение, которое находясь в одной Wi-Fi сети с сервером, общается с ним по TCP через Сокет. Общение Клиент-сервер реализовать получилось, но есть один момент. Если Сервер резко перестает работать, но при этом не закрывает соединение(например выключили свет), как андроид устройство узнает об этом? Стандартные методы Socket isConnected, isClosed не подходят, т.к. выполняют немного другие функции. Облазил весь гугл, но не нашел решения. Много где писали, что Socket не реализует проверку наличия или отсутствия соединения. Вообщем вопрос знатокам, как узнать, что сервер упал?
  • Вопрос задан
  • 1282 просмотра
Пригласить эксперта
Ответы на вопрос 1
Rou1997
@Rou1997
Для этого необходимо реализовать keep-alive, то есть с небольшим интервалом постоянно отправлять специальные запросы, а сервер пусть на них отвечает, причем на стандартную реализацию в библиотеке лучше не надеяться, она запросто может зависеть от ОС.
Между прочим, без keep-alive, то есть без активности, соединение закроется само собой через несколько часов, даже не надо никаких сбоев.
А еще связь может пропасть уже при отправке пакета (потеря контакта в разъеме и т.п.), а потом опять возобновиться, тогда все пройдет без всяких Exception, но принимающая сторона получит поврежденный пакет (с нулевыми байтами начиная с какого-то номера), поэтому принимающая сторона должна проверять пакет и перезапрашивать при необходимости (отправлять специальный запрос, который перезапрашивает этот пакет), с обратной стороны снова проверка, и так до бесконечности, пока сеанс не пройдет успешно.
Наконец, надо проверить, не могут ли 2 пакета "слиться" в 1 при частой отправке, и если могут, то принять меры - обозначить искусственные границы.
Довольно сложный алгоритм получается. Еще хорошо, что сеть локальная, и в ней нет ботов, да и риск сбоев ниже.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы