2010-06-16 7 views
6

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!

+0

Siehe auch http://stackoverflow.com/questions/1233204 – trashgod

+0

Sie den Quellcode für das Projekt "Angry IP Scanner" bei Source Forge überprüfen konnte. http://www.angryip.org/w/Development –

Antwort

5

Sie könnten versuchen, UDP-Broadcast an einen bestimmten Hafen. Alle laufenden Instanzen Ihrer App im Netzwerk können diesen Port abhören und dann mit einer Nachricht antworten, die sie als Host identifiziert.

+1

+1 - Dies ist in etwa analog wie das ARP-Protokoll funktioniert. –

+0

Das Problem mit dem Broadcasting ist, dass es eine Änderung gibt, dass ein anderes Programm oder Dienst auf dem Port laufen könnte, auf dem die Programme zuhören werden. –

0

Jeder Host verfolgt alle Hosts, die er getroffen hat. Wenn Sie herunterfahren, speichern Sie die bekannten Hosts in der Datei und verwenden Sie sie beim nächsten Start erneut.

Alle so viele Minuten, senden Sie jedem der bekannten Hosts eine Liste aller bekannten Hosts.

Auf diese Weise

a) Kein Scannen im Netzwerk
b) Ein neuer Host im Netzwerk

Dann, wenn er braucht, ein neuer Host schließt sich nur ausbreiten 1 anderen Host zu wissen, über alle lernen .

Ein Host, der seit einer Woche nicht mehr angezeigt wird oder von einer neuen IP-Adresse erkannt wird, wird aus der Liste der aktualisierten IP-Adressen gelöscht.

0

Sie könnte versuchen, verwenden DNS service discovery

Es scheint on sourceforge ein Projekt zu sein (dass ich überhaupt nicht ausgesehen haben, über eine oberflächliche Suche zu tun ...)

1

für alle Hosts in lan in Java zu finden, Befehle von Java ausführen und das Ergebnis zu JList

Hier fügen Sie ist die kleine Code, der Ihnen helfen wird, alle Hosts in lan in den Fenstern lesen wird es andere Befehle für andere os nehmen Blick auf den folgenden Code

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(); 
    }