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" em> 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). p> à la place, chaque hôte est un client / serveur qui possède un fichier hosternes.properties strong> 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. P> Au début, il n'y avait que quelques hôtes, de sorte que ce fichier host.properties strong> 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. P> 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é): p> Cependant: p> 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! P> p>
6 Réponses :
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. P>
Toutes les nombreuses minutes, envoyez chacun des hôtes connus une liste de tous les hôtes connus. P>
de cette façon p>
a) pas de balayage de réseau
b) Un nouvel hôte se répandra autour du réseau p>
Puis quand un nouvel hôte rejoint, il doit simplement connaître 1 autre hôte pour en apprendre davantage sur tout le monde. P>
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. P>
Vous pouvez le faire beaucoup plus facilement en utilisant UDP . Vérifiez ce tutoriel pour des exemples. P>
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. P>
+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.
Pour rechercher tous les hôtes dans LAN dans Java Execute Commandes à partir de Java et ajouter le résultat à 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> JList 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();
}
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