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!
Ver también http://stackoverflow.com/questions/1233204 – trashgod
Usted puede comprobar el código fuente para el proyecto "Angry IP scanner" en Source Forge. http://www.angryip.org/w/Development –