6
votes

Trouvez dynamiquement d'autres hôtes dans un réseau local en Java

Il y a quelque temps, j'ai développé une petite application de chat LAN. En Java, qui permet de bavarder avec d'autres hôtes, d'envoyer des images, etc. Bien qu'il ait été créé juste pour le plaisir, il est maintenant utilisé où je travaille.

Actuellement, il n'y a pas "serveur de discussion" sur l'application. Lorsque chaque client enregistre, met à jour son statut, etc. (j'ai aimé l'idée de conception symétrique et non en fonction d'un serveur exécutant sur une autre machine).

à la place, chaque hôte est un client / serveur qui possède un fichier hosternes.properties avec le nom d'hôte des autres hôtes et, par exemple - des émissions à chacun d'entre eux quand Envoi d'un message massif / image / peu importe.

Au début, il n'y avait que quelques hôtes, de sorte que ce fichier host.properties n'était pas un problème. Mais comme la quantité d'utilisateurs augmentait, la nécessité de mettre à jour ce fichier était un peu intimidant. Alors maintenant, j'ai décidé de m'en débarrasser et à chaque fois que l'application. Démarre, déposez dynamiquement les autres hôtes actifs.

Cependant, je ne trouve pas la bonne façon de mettre en œuvre cela. J'ai essayé de démarrer différents threads, chacun d'entre eux recherchant d'autres hôtes dans une gamme connue d'adresses IP. Quelque chose comme ça (simplifié pour le souci de lisibilité): xxx

Cependant:

  • avec un seul fil et une valeur basse dans connexion_time_out (500ms), je me trompe hôte non trouvé statut pour les hôtes réellement actifs.
  • avec une valeur élevée dans connection_time_out (5000ms) et qu'un seul thread prend pour toujours pour finir par
  • Avec plusieurs threads, j'ai également trouvé des problèmes similaires comme le premier, en raison de collisions.

    Alors ... je suppose qu'il y a une meilleure façon de résoudre ce problème, mais je ne pouvais pas le trouver. Aucun conseil? Merci!


2 commentaires

Voir aussi Stackoverflow.com/Questtions/1233204


Vous pouvez vérifier le code source du projet "Scanner IP en colère" à la source Forge. angriP.org/w/Development


6 Réponses :


0
votes

Chaque hôte garde une trace de tous les hôtes qu'ils ont rencontrés. Lorsque vous arrêtez, enregistrez les hôtes connus pour déposer et réutilisez la prochaine fois que vous démarrez.

Toutes les nombreuses minutes, envoyez chacun des hôtes connus une liste de tous les hôtes connus.

de cette façon

a) pas de balayage de réseau
b) Un nouvel hôte se répandra autour du réseau

Puis quand un nouvel hôte rejoint, il doit simplement connaître 1 autre hôte pour en apprendre davantage sur tout le monde.

Un hôte qui n'est pas vu pendant une semaine ou est vu à partir d'une nouvelle adresse IP est supprimé de la liste de mise à jour.


0 commentaires

2
votes

Vous pouvez le faire beaucoup plus facilement en utilisant UDP . Vérifiez ce tutoriel pour des exemples.


0 commentaires

0
votes

Vous pouvez tenter d'utiliser Discovery de service DNS

Il semble y avoir un projet sur Sourceforge (que je n'ai pas regardé, au-delà de faire une superficielle Rechercher ...)


0 commentaires

6
votes

Vous pouvez essayer UDP diffusé à un port spécifique. Toutes les instances d'exécution de votre application sur le réseau pourraient écouter ce port puis répondre avec un message en identifiant comme hôte.


2 commentaires

+1 - Ceci est grossièrement analogue à la façon dont le protocole ARP fonctionne.


Le problème avec la radiodiffusion est qu'il existe une modification d'un autre programme ou service pourrait être exécuté sur le port que le ou les programmes vont écouter.



2
votes

Utilisez BONJOUR / ZEROCONF.

Le projet JMDNS a tout ce dont vous avez besoin.


0 commentaires

1
votes

Pour rechercher tous les hôtes dans LAN dans Java Execute Commandes à partir de Java et ajouter le résultat à JList code>

Voici le petit code qui vous aidera à lire tous les hôtes de Lan sous Windows Sera d'autres commandes pour d'autres systèmes d'exploitation examineront le code suivant P>

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


0 commentaires