AndroidAsync TCP - правильный способ определения сокета больше не доступен с помощью записи?
Мне интересно, как правильно проверить на стороне клиента, что сокет TCP, открытый с помощью библиотеки AndroidAsync, больше не доступен? Это в том случае, если (обычный TCP, не AndroidAsync) сервер не инициировал явное закрытие сокета (поэтому ClosedCallback не вызывается). Например, когда сервер был холодно перезагружен.
Кажется, что DataCallback доступен только тогда, когда сервер отправляет обратно данные и не может быть использован для получения сообщений об ошибках.
Мне кажется также, что
Util.writeAll(socket, (byte[]) payload.array(), new CompletedCallback()
{
@Override
public void onCompleted(Exception ex)
{
if (ex != null)
{
Log.e(TAG, "write failed with ex message= " + ex.getMessage());
throw new RuntimeException(ex);
}
}
});
Исключение тоже не выдает.
Поэтому на данный момент я не уверен, как определить, что сокет больше не доступен, даже если клиент периодически записывает в него данные.
3 ответа
Это бросит IOexception
если вы отправите достаточно данных или позвоните достаточно раз. Он не сработает при первом вызове из-за буферизации TCP на обоих концах.
Я закончил тем, что реализовал своего рода периодическую проверку типа ping. Клиент открывает и немедленно закрывает TCP-соединение с тем же портом, используя простой вызов сокета Java NIO (не используя AndroidAsync). Если это один раз, предполагается, что соединение было потеряно, и попытка восстановления предпринята, как только он снова успешен. Эта периодическая проверка выполняется только тогда, когда приложение находится в фокусе или только что пробуждено. Это явно далеко от идеального обходного пути, но, похоже, работает для моих целей.
Вы можете использовать закрытые / конечные обратные вызовы
socket.setClosedCallback(new CompletedCallback()
{
@Override
public void onCompleted(Exception ex)
{
}
});
socket.setEndCallback(new CompletedCallback()
{
@Override
public void onCompleted(Exception ex)
{
}
});