Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка доступности сервера, Сделал пингер, но не без греха. 
:(
    Опции темы
Platon
Дата 28.2.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 3
Всего: 40



Здравствуйте, уважаемые.

Встала задача сделать проверку запущенности сервера в определенном диапазоне IP адресов, на определенном порте.
Для этого сделал 2 класса:

Код

public class PingerClient {

    private long pingStart;
    private long pingEnd;
    private DatagramSocket ds;

    public PingerClient(int timeout) {
        try {
            ds = new DatagramSocket();
            ds.setSoTimeout(timeout);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    public long ping(String host, int port) throws IOException {
        //TODO: первый пинг занимает слишком много времени
        InetAddress addr = InetAddress.getByName(host);
        DatagramPacket pack = new DatagramPacket(new byte[32], 32, InetAddress.getByName(host), port);
        DatagramPacket rec = new DatagramPacket(new byte[32], 32);
        ds.send(pack);
        pingStart = System.currentTimeMillis();
        try {
            ds.receive(rec);
            while(!addr.equals(rec.getAddress())) {
                ds.receive(rec);
            }
            pingEnd = System.currentTimeMillis();
            return pingEnd - pingStart;
        } catch(Exception e) {
            pingEnd = -1;
            return -1;
        }
    }

    public void close() {
        ds.close();
    }

    public long getDelay() {
        return pingEnd == -1 ? -1 : pingEnd - pingStart;
    }

    public static void main(String[] args) throws IOException {
        for (int i = 0; i < 10; i++) {
            System.out.println(new PingerClient(1000).ping("127.0.0.1", 2007));
        }
    }
}


Код

public class PingerServer {

    private DatagramSocket ds;

    public PingerServer(int port) throws SocketException {
        ds = new DatagramSocket(port);
    }

    public void start() {
        while (!Thread.currentThread().isInterrupted()) {
            try {
                DatagramPacket p = new DatagramPacket(new byte[32], 32);
                ds.receive(p);
                ds.send(new DatagramPacket(new byte[32], 32, p.getSocketAddress()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public void stop() {
        Thread.currentThread().interrupt();
        ds.close();
    }

    public static void main(String[] args) throws SocketException {
        new PingerServer(2007).start();
    }
}


Но, во-первых, при первом пинге происходит долгая задержка, остальные разы пингуется по нулю.
Во-вторых, может есть более корректный способ писать пингеры.
В-третьих, может и пингеры не нужны? Но, пробовал подключаться по сокетам непосредственно к порту сервера. выходило очень долго. 255 адресов локальной сети сканируются крайне долго (при том, что я распараллеливал работу на 20 потоков).
PM MAIL ICQ   Вверх
AntonSaburov
Дата 28.2.2008, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 118



Задержка при первом пинговании - может на свиче буферизоваться. Можено попробовать сделать пакет побольше.

А почему сокетами долго - поставь таймаут поменьше - и будет тебе счастье smile
PM MAIL WWW ICQ   Вверх
Platon
Дата 3.3.2008, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1801
Регистрация: 25.4.2006

Репутация: 3
Всего: 40



Цитата(AntonSaburov @  28.2.2008,  17:43 Найти цитируемый пост)
А почему сокетами долго - поставь таймаут поменьше - и будет тебе счастье smile 

А разве датаграммы не для этих целей еще существуют?
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.