Я пишу приложение для Android, которое инициализирует DatagramSocket
для подключения к серверу, а затем использует бесконечный цикл для периодического (например, каждые 5 секунд) отправки пакетов данных. Код отправки ниже:Точное обнаружение сбоев отправки сокетов в Java
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
.
, пожалуйста, отправьте код сервера. –
@MisterSmith Почему код сервера имеет значение? Мое намерение - обработать случай, когда сервер недоступен. – Artyom
Потому что я предполагаю, что ваш сервер порождает поток на входящее соединение. –