Динамично найдите другие хосты в LAN в Java

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

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

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

В начале было только несколько хостов, таким образом, этот 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 мс) я получаю неправильное состояние Host Not Found для для на самом деле активных хостов.
  • С высоким значением в CONNECTION_TIME_OUT (5 000 мс) и только одном единственном потоке берет навсегда для окончания
  • С несколькими потоками я также нашел проблемы подобными как первая, из-за коллизий.

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

6
задан Federico Cristina 16 June 2010 в 01:49
поделиться

5 ответов

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

5
ответ дан 10 December 2019 в 00:33
поделиться

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

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

2
ответ дан 10 December 2019 в 00:33
поделиться

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

2
ответ дан 10 December 2019 в 00:33
поделиться

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

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

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

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

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

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

0
ответ дан 10 December 2019 в 00:33
поделиться

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

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

0
ответ дан 10 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: