Vor einiger Zeit habe ich eine kleine LAN-Chat-App entwickelt. in Java, die es erlaubt, mit anderen Hosts zu chatten, Bilder zu senden usw. Obwohl es nur zum Spaß erstellt wurde, wird es jetzt dort verwendet, wo ich arbeite.Dynamisch andere Hosts in einem LAN in Java finden
Derzeit gibt es keine "Chat-Server" auf der App. wo jeder Client sich registriert, seinen Status aktualisiert usw. (Ich mochte die Idee des symmetrischen Designs und nicht von einem Server, der auf einem anderen Rechner läuft).
Stattdessen ist jeder Host ein Client/Server, der eine hosts.properties Datei mit dem Hostnamen der anderen Hosts hat, und - zum Beispiel - Sendungen zu jedem von ihnen, wenn eine massive Nachricht/Bild Senden/was auch immer .
Am Anfang gab es nur ein paar Hosts, so dass diese hosts.properties Datei kein Problem war. Aber als die Anzahl der Benutzer anstieg, war die Notwendigkeit, diese Datei zu aktualisieren, etwas entmutigend. So, jetzt habe ich beschlossen, es loszuwerden, und jedes Mal die App. Startet dynamisch die anderen aktiven Hosts.
Allerdings kann ich nicht den richtigen Weg finden, dies zu implementieren. Ich habe versucht, verschiedene Threads zu starten, von denen jeder nach anderen Hosts in einem bekannten Bereich von IP-Adressen sucht. So etwas wie dies (aus Gründen der Lesbarkeit vereinfacht):
/** 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!
}
jedoch:
- Mit einem einzigen Thread und einem niedrigen Wert in CONNECTION_TIME_OUT (500ms) bekomme ich falsch Host nicht gefunden Status für tatsächlich aktive Hosts.
- mit einem hohen Wert in CONNECTION_TIME_OUT (5000ms) und nur eine einzigen Faden nimmt immer
- mit mehreren Threads zu beenden habe ich auch ähnliche Probleme wie die ersten gefunden, aufgrund von Kollisionen.
Also ... Ich denke, es gibt eine bessere Möglichkeit, dieses Problem zu lösen, aber ich konnte es nicht finden. Irgendein Rat? Vielen Dank!
Siehe auch http://stackoverflow.com/questions/1233204 – trashgod
Sie den Quellcode für das Projekt "Angry IP Scanner" bei Source Forge überprüfen konnte. http://www.angryip.org/w/Development –