Java обнаруживает потерянное соединение [дубликат]

Как насчет:

ObjectAnimator animator=ObjectAnimator.ofInt(yourHorizontalScrollView, "scrollX",targetXScroll );
animator.setDuration(800);
animator.start();
26
задан Sergey Brunov 18 January 2016 в 10:40
поделиться

7 ответов

Что ж, лучший способ узнать, прервано ли ваше соединение, - это попытаться читать / писать из сокета. Если операция не удалась, значит, вы когда-нибудь потеряли соединение.

Итак, все, что вам нужно сделать, это попытаться прочитать через некоторый интервал, а если чтение не удастся, попробуйте повторно подключиться.

Важными событиями для вас будут, когда ошибка чтения - вы потеряли соединение, а при подключении нового сокета вы восстановили соединение.

Таким образом вы можете отслеживать время работы и время простоя.

20
ответ дан 28 November 2019 в 07:06
поделиться

Несмотря на то, что TCP / IP является протоколом, ориентированным на соединение, обычно данные не передаются через незанятое соединение. Вы можете держать сокет открытым в течение года, и стек IP-адресов не отправит через него ни одного бита. Чтобы заметить, что соединение потеряно, вы должны отправить некоторые данные на уровне приложения. (*) Вы можете попробовать это, отсоединив телефонный кабель от модема ADSL. Все соединения на вашем ПК должны оставаться активными, если только приложения не имеют какого-либо механизма поддержки активности на уровне приложений.

Таким образом, единственный способ заметить потерю соединения - открыть TCP-соединение с некоторым сервером и прочитать с него некоторые данные. Возможно, самым простым способом было бы подключиться к какому-либо FTP-серверу и время от времени получать небольшой файл или список каталогов. Я никогда не видел универсального сервера, который действительно предназначался для этого случая,

13
ответ дан 28 November 2019 в 07:06
поделиться

Почему бы не использовать isReachable () метода java.net.InetAddress ?

Как это работает, зависит от реализации JVM, но:

Типичная реализация будет использовать ICMP ECHO REQUEST, если привилегия может быть получен, иначе он попытается установить TCP-соединение на порт 7 (Echo) целевого хоста.

Если вы хотите, чтобы соединение постоянно оставалось открытым, чтобы вы могли видеть, когда это не удается, вы можете подключиться к серверу, на котором работает протокол ECHO самостоятельно, вместо того, чтобы делать это для isReachable () вы читаете и записываете данные и ждете отказа.

7
ответ дан 28 November 2019 в 07:06
поделиться

Итак, я наконец-то заставил его работать с

try
{
    Socket s = new Socket("stackoverflow.com",80);
    DataOutputStream os = new DataOutputStream(s.getOutputStream());
    DataInputStream is = new DataInputStream(s.getInputStream());
    while (true)
    {
        os.writeBytes("GET /index.html HTTP/1.0\n\n");
        is.available();
        Thread.sleep(1000);
    }
}
catch (IOException e)
{
    System.out.println("connection probably lost");
    e.printStackTrace();
}

Не так чисто, как я надеялся, но он не работает, если я оставлю os.writeBytes ().

1
ответ дан 28 November 2019 в 07:06
поделиться

Вы можете попробовать посмотреть интервал тайм-аута сокета . С коротким таймаутом (я полагаю по умолчанию - «бесконечный тайм-аут»), вы можете перехватить исключение или что-то еще, когда хост становится недоступным.

1
ответ дан 28 November 2019 в 07:06
поделиться

Вы можете пинговать машину каждые несколько секунд, и это будет довольно точно. Будьте осторожны, не используйте DOS.

Другой альтернативой может быть запуск небольшого сервера на удаленном компьютере и сохранение соединения с ним.

0
ответ дан 28 November 2019 в 07:06
поделиться

Возможно, проще подключиться к Yahoo / Google или где-нибудь в этом роде.

    URL yahoo = new URL("http://www.yahoo.com/");
    URLConnection yc = yahoo.openConnection();
    int dataLen = yc.getContentLength() ;

Нил

0
ответ дан 28 November 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: