Многоадресный UDP - хороший способ сделать это. Он используется в нескольких технологиях, которые поддерживают автоматическое обнаружение сетевых устройств через локальные IP-сети (UPnP и ZeroConf).
Multicast UDP не является TCP, но он по-прежнему основан на IP и, следовательно, использует тот же механизм адресации, то есть IP-адреса. Довольно часто это сравнивается с радиовещанием, то есть отправителю многоадресной рассылки нужно только отправить 1 сообщение (т.е. это как широковещание), но только клиенты, которые «настроены» на канал многоадресной рассылки, получат его.
Вы можете сделать быстрый поиск в Google или Википедии по ним в качестве начала, но основная идея заключается в следующем:
- когда клиент запускается, он отправляет многоадресное UDP-сообщение приветствия на некоторый предварительно заданный многоадресный адрес и порт (например, UPnP использует 239.255.255.250:1900)
- существующие клиенты прослушивают входящие многоадресные «привет» сообщения по указанному адресу и порту - когда клиент получает их, он отправляет ответ отправителю
- клиент, отправляющий сообщение «привет», получает ответ от каждого существующего клиента в сети и теперь знает IP-адрес каждого клиента
Если вы ищете библиотеки для использования, библиотеки UPnP могут быть немного тяжелыми, и многим людям они вообще не нравятся, поэтому ZeroConf может быть немного более подходящим. Я не знаю каких-либо реализаций java таких вещей, но я уверен, что вы можете найти некоторые, немного покопавшись.