Encontrar outros computadores na rede executando meu programa

Gostaria de saber se há alguma forma de estabelecer conexões entre instancias do meu programa por meio da Rede Local, por exemplo, eu abrir meu programa de compartilhamento de arquivos no meu computador e ele detectar que o mesmo programa também está aberto em outro computador da rede local e conectar-se a se computador, assim permitindo que compartilhemos arquivos sem precisar informar IP e portas. Eu já pensei em usar sockets, mas pra usar eles eu preciso informar IP e porta, que no meu caso pode ser qualquer um ( já que qualquer computador pode rodar a aplicação).

Olá ,

Leia sobre Zeroconf:

Você pode varrer todos os IPs da sua rede local usando um for por exemplo, e mandando uma mensagem (via socket ou afins). Cada computador com o seu programa rodando então responde essa mensagem, e ambos ficam sabendo da presença um do outro. Isso não é tão demorado (a não ser que sua rede tenha problemas) e dá até para usar threads se você quiser.

Algo do tipo:

EnviadorDeMensagem mensageiro = new EnviadorDeMensagem(); // classe pra enviar a mensagem

for (i = 0; i < 256; i++){
  mensageiro.enviarMensagem("192.168.0." + i); // manda a mensagem pra um IP da rede local
  mensageiro.receberMensagem(); //aguarda X segundos pro outro computador responder
  // faz alguma coisa com o retorno recebido
}

Abraço.

Pesquise sobre broadcast UDP. Assim, você consegue mandar um pacote para a rede para uma determinada porta e conseguirá descobrir todos os IPs que conseguiram responder, ou seja, que estiverem com seu programa rodando e recebendo conexões nessa mesma porta.

Consegui fazer a broadcast, mas como eu faria pra obter o IP da maquina que está enviando o pacote?