Некоторое время назад я разработал небольшое приложение для сетевого чата.в 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 мс) и только один единственный поток завершается вечно
- С несколькими потоками я также обнаружил проблемы, похожие на первый, из-за столкновений.
Итак ... Я думаю, есть лучший способ решения этой проблемы, но яне мог найти это.Любой совет?Спасибо!