2010-06-16 15 views
6

Hace un tiempo desarrollé una pequeña aplicación de chat de LAN. en Java, que permite chatear con otros hosts, enviar imágenes, etc. Aunque fue creado solo por diversión, ahora está siendo utilizado en el lugar donde trabajo.Encuentra dinámicamente otros hosts en una LAN en Java

Actualmente, no hay "servidor de chat" en la aplicación. donde cada cliente se registra, actualiza su estado, etc. (Me gustó la idea del diseño simétrico y no depende de que un servidor se ejecute en otra máquina).

su lugar, cada huésped es un cliente/servidor que tiene un hosts.properties archivo con el nombre de host de los otros ejércitos, y - por ejemplo - las transmisiones a cada uno de ellos al enviar un mensaje masivo/imagen/lo que sea .

Al principio solo había un par de hosts, por lo que este archivo hosts.properties no fue un problema. Pero a medida que aumentaba la cantidad de usuarios, la necesidad de actualizar ese archivo era un poco desalentadora. Así que ahora he decidido deshacerme de él, y cada vez que la aplicación. comienza, encuentra dinámicamente los otros hosts activos.

Sin embargo, no puedo encontrar la forma correcta de implementar esto. Intenté iniciar diferentes subprocesos, cada uno de ellos buscando otros hosts en un rango conocido de direcciones IP. Algo como esto (simplificado para facilitar la lectura):

/** 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! 
} 

Sin embargo:

  • Con un solo hilo y un valor bajo en CONNECTION_TIME_OUT (500 ms) me sale mal Host no encontrado estado para los hosts realmente activos.
  • con un alto valor en CONNECTION_TIME_OUT (5000ms) y sólo un hilo solo necesita siempre para terminar
  • Con varios hilos También he encontrado problemas similares como la primera, debido a las colisiones.

Así que ... Supongo que hay una forma mejor de resolver este problema, pero no pude encontrarlo. ¿Algún consejo? ¡Gracias!

+0

Ver también http://stackoverflow.com/questions/1233204 – trashgod

+0

Usted puede comprobar el código fuente para el proyecto "Angry IP scanner" en Source Forge. http://www.angryip.org/w/Development –

Respuesta

5

Usted podría tratar de difusión UDP a una específica Puerto. Todas las instancias en ejecución de su aplicación en la red podrían escuchar ese puerto y luego responder con un mensaje que los identifique como un host.

+1

+1 - Esto es más o menos análogo a cómo funciona el protocolo ARP. –

+0

El problema con la transmisión es que hay un cambio en otro programa o servicio que podría estar ejecutándose en el puerto en el que los programas estarán escuchando. –

0

Cada host realiza un seguimiento de todos los hosts que han conocido. Cuando se apaga, guarde los hosts conocidos para archivar y reutilizar la próxima vez que inicie.

Cada tantos minutos, envíe a cada uno de los hosts conocidos una lista de todos los hosts conocidos.

De esa manera

a) Ningún escaneado en red
b) Un nuevo huésped se extienda alrededor de la red

Luego, cuando un nuevo huésped se une, sólo necesita saber 1 otro host para aprender acerca de todo el mundo .

Un host que no se ve en una semana o se ve desde una nueva IP se elimina de la lista de actualizaciones.

1

Para encontrar todos los hosts en la LAN en java ejecutar comandos de Java y añadir el resultado a JList

Aquí está el pequeño código que le ayudará a usted a leer todos los hosts en la LAN en las ventanas habrá otros comandos para otros os toman vistazo al siguiente código

try { 

    Runtime rt = Runtime.getRuntime(); 
    FileWriter write=new FileWriter("mylist.txt"); 
    BufferedWriter writer=new BufferedWriter(write); 
    Process pr = rt.exec("net view"); 

    BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); 

    String line=null; 
    String hosts=""; 
    while((line=input.readLine()) != null) { 
     Thread.sleep(100); 
     if((!(line.equals("")))&&(!(line.equalsIgnoreCase("Server Name   Remark")))&&(!(line.equalsIgnoreCase("-------------------------------------------------------------------------------")))&&(!(line.equalsIgnoreCase("The command completed successfully.")))) 
     { 
      line=line.replace('\\',' '); 
      line=line.trim(); 
      listModel.addElement(line); 
      hosts=hosts+line.trim()+","; 
      hosts=hosts.trim(); 
     } 
    } 
    writer.write(hosts); 
    writer.close(); 
    } catch(Exception e) { 
     System.out.println(e.toString()); 
     e.printStackTrace(); 
    } 
Cuestiones relacionadas