Я пишу приложение для Android, которое инициализирует DatagramSocket
для подключения к серверу, а затем использует бесконечный цикл для периодической (например, каждые 5 секунд) отправки пакетов данных.Код отправки ниже:
DatagramPacket packet = new DatagramPacket(message, message.length);
try {
socket.send(packet);
}
catch (IOException e) {
// Log failure and return
}
// Log success
Теперь я могу позволить себе потерять пакет время от времени.Но я хотел бы иметь возможность определять, становится ли сервер недоступным (например, происходит сбой), когда я подключен, и в этом случае я хотел бы сохранить сообщения, которые я отправляю (чтобы отправить их в другое время).Первоначально я думал, что исключение будет выдаваться каждый раз, когда я пытаюсь отправить пакет через этот сокет, и, следовательно, смогу справиться с хранением сообщений в моем блоке catch
.На самом деле это частично работает.Я моделирую сбой сервера, просто отключив сервер, и начинаю получать исключения с сообщением sendto failed: ECONNREFUSED (Connection refused)
при отправке пакета.Проблема в том, что не каждая попытка отправки вызывает исключение, а только каждую четную попытку - поэтому мой журнал выглядит как
Успех, Ошибка, Успех, Ошибка, ...
В моем понимании происходит то, что при первой попытке отправить пакет после того, как сервер становится недоступным, пакет отправляется, сокет не ждет, чтобы увидеть, есть ли сообщение об ошибке, и регистрируется успех.Затем при следующей попытке сокет пытается отправить пакет, видит предыдущее сообщение об ошибке и выдает исключение, не отправляя пакет, что приводит к регистрации ошибки.Однако, поскольку пакет не был отправлен, при следующей попытке отправить пакет снова не будет возникать исключение.Это гипотеза, которую я нарисовал, увидев мой журнал, поэтому я могу ошибиться в своих рассуждениях здесь.
Мой вопрос: есть ли способ убедиться, что исключение выдается каждый раз, пока сервернедоступен?Или есть какой-то другой способ обнаружить, что другой конец сокета молча отключился?Я пытался проверить socket.isConnected()
внутри моего цикла, но он всегда возвращает true
.