получить IP-адреса компьютера, доступные в сети? -Джава - PullRequest
1 голос
/ 27 августа 2011

Я делаю приложение для обмена файлами, которое будет искать компьютеры, на которых запущено приложение в той же сети. Поэтому я хотел бы, чтобы мое приложение обнаруживало компьютеры и их IP-адреса. Достижима ли эта задача с помощью Java?

спасибо

Ответы [ 7 ]

3 голосов
/ 27 августа 2011

Это одна из основных проблем в распределенных вычислениях, и в некоторой степени работают два подхода:

Служба реестра

  • Где-то в сети вы запускаете службу реестра с известным хостом и номером порта. Эта служба должна быть доступна / адресуема из любого места, где вы хотите запустить приложение.

  • При запуске каждый экземпляр приложения в сети регистрируется в реестре.

  • Когда какой-либо машине / программе требуется найти экземпляр приложения, он запрашивает реестр.

Проблемы:

  • Вам приходится иметь дело с экземплярами приложений, которые "уходят", не сообщая реестру.

  • У вас должен быть способ восстановить состояние, если реестр перезапустится.

  • Приложения должны знать имя (или адрес) и порт экземпляра реестра.

Broadcast / Multicast

  • Каждый экземпляр приложения прослушивает общеизвестный «широковещательный» или «многоадресный» адрес / порт.

  • Когда программа хочет найти экземпляры приложения, она отправляет широковещательный / многоадресный запрос.

  • Каждый экземпляр отвечает на запрос, сообщая свои данные.

  • Программа накапливает ответы для построения списка всех "живых" экземпляров.

Проблемы:

  • Это не масштабируется. Каждый запрос от M программ направляется на N машин и генерирует N ответов. По мере роста M и N сетевой трафик растет квадратично.

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

  • Вещание обычно не пересекает границы сети. Многоадресная передача требует специальной настройки.


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

Простой подход - определить существующую технологию распределенных вычислений, которая сделает большую часть работы за вас. Например, RMI и реестр RMI, динамический DNS, CORBA, JINI.

1 голос
/ 28 августа 2011

Я нашел ответ на этот вопрос .. Я посмотрел вокруг и нашел этот код. Это не лучший способ сделать это, но это работает ..

import java.io.IOException;
import java.net.InetAddress;

public class networkPing {

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

    InetAddress localhost = InetAddress.getLocalHost();
    // this code assumes IPv4 is used
    byte[] ip = localhost.getAddress();

    for (int i = 1; i <= 254; i++)
    {
        ip[3] = (byte)i;
        InetAddress address = InetAddress.getByAddress(ip);
    if (address.isReachable(1000))
    {
        System.out.println(address + " machine is turned on and can be pinged");
    }
    else if (!address.getHostAddress().equals(address.getHostName()))
    {
        System.out.println(address + " machine is known in a DNS lookup");
    }

    }

}
}
0 голосов
/ 04 июня 2018

Я нашел эту часть служебного класса JCS (библиотеки кэширования) Apache commons особенно полезной, просто скопировал ее в мой проект, поскольку я не хотел / не нуждался в том, чтобы включать всю библиотеку JCS, а код отдельно не доступен в другом месте (например, в apache commons-net было бы неплохо):

0 голосов
/ 08 декабря 2015

Каждый компьютер должен отправить DatagramPacket с в группу многоадресной рассылки. Также получайте пакеты от группы. затем используйте getAddress(), чтобы получить InetAddress объект из пакета.

Помните: для получения многоадресных пакетов система должна присоединиться к группе многоадресной рассылки. Но любой (не нужно присоединяться) может отправлять пакеты в многоадресную группу.

Пример здесь.

0 голосов
/ 27 августа 2011

Либо используйте многоадресный DNS (я не знаю, как вы можете использовать его на Java / Windows).

Или использовать IP-трансляцию (с UDP).

0 голосов
/ 27 августа 2011

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

Если, например, вы имеете в виду «ЛВС», это не имеет значения в TCP, но SAMBA может помочь.

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

0 голосов
/ 27 августа 2011

Вы должны взглянуть на эту статью на jxta . Это P2P-инфраструктура Sun для Java, и она используется множеством популярных приложений. Также может быть полезно взглянуть на некоторые приложения, использующие jxta, потому что они уже могут делать что-то вроде того, что вы пытаетесь сделать.

...