Сканер сетевых служб Java

Я пытаюсь написать класс, который будет сканировать локальную сеть в поисках работающей службы.

Проблема в том, что если адрес неактивен (нет ответа), он зависает на нем более 5 секунд, что нехорошо.

Я хочу сделать это сканирование за несколько секунд. Кто-нибудь может дать совет?

Моя часть кода ниже

        int port = 1338;
    PrintWriter out = null;
    BufferedReader in = null;

    for (int i = 1; i < 254; i++){

        try {
            System.out.println(iIPv4+i);
            Socket kkSocket = null;

            kkSocket = new Socket(iIPv4+i, port);

            kkSocket.setKeepAlive(false);
            kkSocket.setSoTimeout(5);
            kkSocket.setTcpNoDelay(false);  

            out = new PrintWriter(kkSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
            out.println("Scanning!");
            String fromServer;
            while ((fromServer = in.readLine()) != null) {
                System.out.println("Server: " + fromServer);
                if (fromServer.equals("Server here!"))
                    break;
            }

        } catch (UnknownHostException e) {

        } catch (IOException e) {

        }
    }

Спасибо за ответы! Вот мой код для всех, кто это ищет!

        for (int i = 1; i < 254; i++){

        try {
            System.out.println(iIPv4+i);
            Socket mySocket = new Socket();
            SocketAddress address = new InetSocketAddress(iIPv4+i, port);

            mySocket.connect(address, 5);   

            out = new PrintWriter(mySocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
            out.println("Scanning!");
            String fromServer;
            while ((fromServer = in.readLine()) != null) {
                System.out.println("Server: " + fromServer);
                if (fromServer.equals("Server here!"))
                    break;
            }

        } catch (UnknownHostException e) {

        } catch (IOException e) {

        }
    }

person David    schedule 10.02.2011    source источник


Ответы (2)


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

 Socket kkSocket = new Socket();
 kkSocket.bind( null )/ // bind socket to random local address, but you might not need to do this
 kkSocket.connect( new InetSocketAddress(iIPv4+i, port), 500 ); //timeout is in milliseconds
person biziclop    schedule 10.02.2011
comment
Спасибо за предложение, попробую! - person David; 10.02.2011

Вы можете создать неподключенный сокет с помощью конструктора noarg _1 _, а затем вызовите _ 2_ с небольшим значением тайм-аута.

Socket socket = new Socket();
InetSocketAddress endpoint = new InetSocketAddress("localhost", 80);
int timeout = 1;
socket.connect(endpoint, timeout);
person adrianboimvaser    schedule 10.02.2011
comment
Тайм-аут выражается в миллисекундах, поэтому для одной секунды таймаут должен быть равен 1000. - person Gareve; 07.08.2014