Динамически найти другие хосты в локальной сети в Java - PullRequest
6 голосов
/ 16 июня 2010

Некоторое время назад я разработал небольшое приложение для сетевого чата.в Java, который позволяет общаться с другими хостами, отправлять изображения и т. д. Хотя он был создан просто для удовольствия, теперь он используется там, где я работаю.

В настоящее время "чат-сервер" * 1004 отсутствует* в приложении.где каждый клиент регистрируется, обновляет свое состояние и т. д. (мне понравилась идея симметричного дизайна, не зависящая от сервера, работающего на каком-либо другом компьютере).

Вместо этого каждый хост является клиентом / сервером, который имеет файл hosts.properties с именем хоста других хостов и, например, осуществляет широковещательную рассылку каждому из них при отправкемассивное сообщение / изображение / что угодно.

В начале было всего несколько хостов, поэтому этот файл hosts.properties не представлял проблемы.Но по мере того, как количество пользователей увеличивалось, необходимость обновления этого файла была немного пугающей.Так что теперь я решил избавиться от этого и каждый раз от приложения.Запускается, динамически находят другие активные хосты.

Однако я не могу найти правильный способ реализовать это.Я попытался запустить разные потоки, каждый из которых ищет другие узлы в известном диапазоне IP-адресов.Примерно так (упрощено для удобства чтения):

/** HostsLocator */
public static void searchForHosts(boolean waitToEnd) {
    for (int i=0; i < MAX_IP; i+= MAX_IP / threads) {
        HostsLocator detector = new HostsLocator(i, i+(MAX_IP / threads - 1)); // range: from - to
        new Thread(detector).start();                 
    }
}

public void run() {
    for (int i=from; i<=to; i++)
        findHosts( maskAddress + Integer.toString(i) );
}

public static boolean findHosts(String IP) {
    InetAddress address = InetAddress.getByName(IP);
    if ( address.isReachable(CONNECTION_TIME_OUT) )
        // host found!
}

Однако:

  • С одним потоком и низким значением в CONNECTION_TIME_OUT (500 мс) Я ошибаюсь Хост не найден Статус для фактически активных хостов.
  • С высоким значением в CONNECTION_TIME_OUT (5000 мс) и только один единственный поток завершается вечно
  • С несколькими потоками я также обнаружил проблемы, похожие на первый, из-за столкновений.

Итак ... Я думаю, есть лучший способ решения этой проблемы, но яне мог найти это.Любой совет?Спасибо!

Ответы [ 6 ]

5 голосов
/ 16 июня 2010

Вы можете попробовать UDP Broadcast на определенный порт. Все запущенные экземпляры вашего приложения в сети могут прослушивать этот порт, а затем отвечать сообщением, идентифицирующим их как хост.

2 голосов
/ 16 июня 2010

Используйте Bonjour / Zeroconf.

В проекте jmdns есть все, что вам нужно.

2 голосов
/ 16 июня 2010

Вы можете сделать это намного проще, используя UDP . Проверьте этот учебник для примеров.

1 голос
/ 09 марта 2012

Чтобы найти все хосты в локальной сети в java, выполните команды из java и добавьте результат в JList

Вот небольшой код, который поможет вам прочитать все хосты в локальной сети в окнах.другие команды для других ОС взгляните на следующий код

try {

    Runtime rt = Runtime.getRuntime();
    FileWriter write=new FileWriter("mylist.txt");
    BufferedWriter writer=new BufferedWriter(write);
    Process pr = rt.exec("net view");

    BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream()));

    String line=null;
    String hosts="";
    while((line=input.readLine()) != null) {
        Thread.sleep(100);
        if((!(line.equals("")))&&(!(line.equalsIgnoreCase("Server Name            Remark")))&&(!(line.equalsIgnoreCase("-------------------------------------------------------------------------------")))&&(!(line.equalsIgnoreCase("The command completed successfully.")))) 
        {
            line=line.replace('\\',' ');
            line=line.trim();
            listModel.addElement(line);
            hosts=hosts+line.trim()+",";
            hosts=hosts.trim();
        }
    }
    writer.write(hosts);
    writer.close();
    } catch(Exception e) {
        System.out.println(e.toString());
        e.printStackTrace();
    }
0 голосов
/ 16 июня 2010

Вы можете попытаться использовать Обнаружение службы DNS

Похоже, есть проект на sourceforge (на который я не смотрел, кроме быстрого поиска ...)

0 голосов
/ 16 июня 2010

Каждый хост отслеживает всех встреченных им хостов. При завершении работы сохраните известные хосты в файл и используйте их при следующем запуске.

Каждые несколько минут отправляйте каждому из известных хостов список всех известных хостов.

Таким образом

а) Нет сканирования по сети
б) Новый хост будет распространяться по сети

Затем, когда присоединяется новый хост, ему просто нужно знать еще одного хоста, чтобы узнать обо всех.

Хост, который не виден в течение недели или виден с нового IP-адреса, удаляется из списка обновленных.

...