Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > Проверка подключения сокета


Автор: soulcub 1.3.2010, 19:24
Похожая тема уже есть, но не решенная.. И 2003 года.. Потому думаю туда не часто заглядывают люди) Может за 7 лет кто-то нашел решение.

Есть сокет и клиент. Между ними идет передача данных. Интернет отключается, данные передаваться больше не могут.. Возможно ли какой-то функцией это засечь, кроме как периодически отсылать и принимать левые пакеты, пока в этой передаче не будет сбоя?
Код

import java.net.*;
import java.io.*;

public class Client {

    public static void main(String[] ar) {

        int serverPort = 1111;
        String address = "5.251.155.121";

        try {
            InetAddress ipAddress = InetAddress.getByName(address);
            System.out.println("Подключаюсь..");
            Socket socket = new Socket(ipAddress, serverPort);
            System.out.println("Успешно.");
        }

        catch (Exception x) {
            System.out.println("Ошибка.");
        }

        ............................................

        socket.close();
}


Код

import java.net.*;
import java.io.*;

public class Server {

    public static void main(String[] ar) throws IOException {

        int port = 1111;
        ServerSocket ss = new ServerSocket(Integer.valueOf("1111"));
        Socket socket = ss.accept();

        ............................................

        socket.close();
        ss.close();
   }

}


Автор: LSD 2.3.2010, 12:41
Цитата(soulcub @  1.3.2010,  19:24 Найти цитируемый пост)
Возможно ли какой-то функцией это засечь, кроме как периодически отсылать и принимать левые пакеты, пока в этой передаче не будет сбоя?

Гарантированно - нельзя. Когда у нас была подобная задача мы поставили пару экспериментов выдергивая шнур из компьютера. Системы под Windows XP которая была блокирована на чтении из сокета сразу выдавала ошибку. При попытке передачи данных, тоже сразу получали IOException. А вот система под управлением Linux выкидывала ошибку далеко не сразу, блокированая на чтении из сокета вообще не выдавала ошибки (за разумное время), при попытке записи выдавала ошибку через пару минут (в зависимости от размера таймаута). 

Так что для надежной работы надо предусмотреть heartbeat.

Автор: soulcub 2.3.2010, 17:11
Спасибо огромное. Тоже проводили опыты с выдергиванием шнура) Эх... Окей, будем делать постоянный пинг)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)