IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Récupérer adresse IP avec getByName() avec la classe InetAddress


Sujet :

Java

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Récupérer adresse IP avec getByName() avec la classe InetAddress
    Bonjour

    J'ai réseau ou il y a deux ordinateur connectés en ethernet, je voudrais récupérer l'adresse IP de l'autre ordi. Je récupère bien une adresse IP mais ce n'est pas la bonne et ne correspond pas non plus à l'adresse de la carte WI-FI.
    je vous met la partie de code que j'ai utilisée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String nom = String.valueOf("Julie".hashcode());
    InetAddress adresseserveur = InetAddress.getByName(nom);
    System.out.println(adresseserveur.getHostAddress());
    j'ai essayée en mettant un nom aléatoire au lieu de Julie, Le programme ne fait rien. Ça montre bien qu'il récupère l'adresse de l'autre ordinateur, j'ai aussi essayer en mettant le propre nom de l'ordi ( comme si je faisais un getLocalHost() et il me renvoie aussi une adresse IP qui ne correspond a rien et qui est bien sur différente du getLocalHost();.

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    C'est quoi çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String nom = String.valueOf("Julie".hashcode());

    a++

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    cette ligne sert a mettre "julie" en ascii. quand je mettais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InetAddress adresseserveur = InetAddress.getByName("julie");
    le programme ne faisait rien, je me suis donc dit q'il faut mettre en ascii et avec cette ligne il trouve l'autre ordinateur apparament

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par transistor59 Voir le message
    cette ligne sert a mettre "julie" en ascii.
    Non.
    Cela génère un hashcode qui n'a rien à voir avec la valeur ascii de la chaine...


    a++

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    j'ai trouvé ça le forum "comment ça marche"

    j'ai changé le code pour obtenir le code ascii
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    String serveur = "Julie";
    StringBuilder sb= new StringBuilder();
    for (int i= 0; i < string.length(); i++)
       sb.append((int)string.charAt(i));
    String nom = String.valueOf(sb);
    InetAddress adresseserveur = InetAddress.getByName(nom);
    mais la le programme ne fait rien

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Ton code, en dehors du fait qu'il ne doit pas compiler, parcourt les caractères de la chaîne, les transformes en int, les concatène. Donc ta chaîne à la fin vaut "74117108105101" ! Ce que tu aurais pu savoir en affichant cette chaîne...


    Une chaîne en java n'a pas d'encodage : on peut obtenir à partir d'une chaîne un tableau d'octets dans un encodage donné, comme l'US-ASCII, par la méthode getBytes(encodage).

    Quant à la méthode getByName() de INetAdress, elle prend une chaîne en paramètre. Il n'y a pas à se préoccuper de l'encodage, juste que le nom qu'on passe est bien un nom de host existant, comme www.developpez.net, ou une adresse ip, sous forme de chaîne.

    L'exemple que tu as trouvé sur "comment ça marche" était un peu absurde, car non expliqué. Si "A".hashCode() donne effectivement 65 (qui est, certe, la même valeur que le code ascii de A), c'est juste presque un hasard. En tout cas, on ne doit pas compter dessus. Et, surtout, on ne peut pas en conclure qu'on peut utiliser cette bidouille étendu à plusieurs caractères, d'autant plus que le hascode est un int. La méthode hashcode() donne le hashcode d'une instance et il se trouve que pour une chaîne, celui-ci est déterminé comme une combinaison des valeurs des caractères de la chaîne (voir le code de la méthode pour le détail de cette combinaison si ça t'intéresse) et que lorsque cette chaîne a un seul caractère, le hashcode est la valeur de ce caractère (exactement 31 * 0 + valeurDuCaractere). Quant à l'encodage utilisé pour représenter les caractères sous forme de valeur (char) en interne, c'est de l'UTF-16, mais on ne devrait pas s'en préoccuper. On se préoccupe de l'encodage uniquement lors d'un traitement externe, comme un stockage dans un fichier, par exemple.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je sais pas où t'as trouvé ça, mais ça fait n'importe quoi ton code


    la méthode getByName, comme son nom l'indique, doit prendre le nom de la machine. Le nom d'un machine c'est un truc du genre

    www.developpez.net

    Si tu es en réseau interne, tu dois disposer d'un serveur DNS où sont enregistrées les machines et les IPs. Sans ça, pas question d'utiliser getByName. Si la méthode que tu utiliser sort "quelque chose", c'est parce que tu lui passe un String contenant un nombre, et qu'il prend ça pour un IPv6, si t'as la chance d'avoir un nombre qui ressemblait à quelquechose dans ipv6!

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    ok je vais voir pour un réseau DNS
    merci

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    un servuer DNS, pas un réseau DNS !

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    oui un serveur DNS
    pour en faire un l suffit pas de mettre l'adresse IP dans la partie DNS ou l'on change l'adresse IP ? parce que le programme ne marche pas.

  11. #11
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Non, il faut aussi qu'il y ait vraiment un serveur DNS à l'IP en question.

    Malheureusement mettre un DNS chez soi est passablement compliqué à moins d'avoir un linux et de pas avoir peur de lire des tutoriels.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  12. #12
    Membre expérimenté
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Points : 1 540
    Points
    1 540
    Par défaut
    Bonsoir,
    Lorsque vous configurez votre réseau, vous ne vous contentez pas de fournir une configuration IP à votre machine, vous lui donnez aussi un nom sur le réseau. Si vous n'en avez pas défini un vous-même, alors le système d'exploitation en place lui en aura attribué un par défaut lors de son installation. Il s'agit généralement d'un nom issu de la composition de la marque de la machine et de son numéro de série récupéré dans le BIOS de la machine.
    Cela signifie qu'il n'est pas nécessaire dans le cas de petits réseau unique ne disposant que d'un seul plan d'adressage sans routeur d'avoir un serveur DNS.
    Sachant que les machines dialoguent entre elles avec leurs adresses IP (adresse MAC en réalité, mais on ne va pas compliquer les choses), pour que votre requête getByName fonctionne, il faut bien que quelqu'un traduise le nom fournit en adresse IP.
    Si votre réseau ne dispose pas de serveur DNS pour effectuer cette traduction, alors il ne reste plus que l'OS.
    Sur une machine Windows, par défaut, le protocole TCP/IP active NetBIOS. NetBIOS est un système de résolution de nom. Il permet de traduire un nom, en adresse IP. Il est cependant spécifique à Windows, et n'est pas très performant. Quoi qu'il en soit, Windows, lorsqu'il démarre effectue une sorte de sondage du réseau et récupère les noms des machines présente à ce moment. Il en profite pour remplir un cache qui lui permet ensuite de résoudre les noms. C'est pourquoi, après avoir démarré sa machine, au bout de quelques minutes, si on "browse" le réseau on peut voir les noms des autres machines Windows, alors qu'il n'y a pas de serveur DNS.
    Donc, si sur votre poste, vous consulter vos favoris réseau, et que vous regardez votre réseau, vous devriez voir apparaître le nom de votre machine, et celui de l'autre poste. Ce sera le cas avec un Windows édition familiale, dans le cas contraire, il faudra veiller à activer le partage réseau sur les postes, ou a créer un groupe résidentiel.
    Pour résumer, quelle que soit la façon dont vous utiliserez finalement la méthode getByName(...), elle ne pourra fonctionner que si vos machines se voient au niveau de l'OS, et en utilisant leur nom réseau. Ne pas confondre avec le nom de session/utilisateur. Si les machines se voient, et que vous utilisez les bons noms, alors ça ne peut que fonctionner et donner un résultat correcte....

    Pour résumer :
    Si votre réseau ne dispose pas de serveur DNS, la résolution de nom ne peut se faire que localement. En d'autre termes, la machine doit se débrouiller toute seule. C'est pourquoi le système d'exploitation, à son niveau gère un cache qu'il entretient pendant son fonctionnement. Et lorsque un programme a besoin de résoudre un nom, en interrogeant le système, il consultera ce cache, c'est ce cache qui traduira le nom en adresse. En plus de ce cache, le système hôte dispose aussi d'un fichier dédié, que l'on nomme "le fichier host".
    Donc, pour traduire un nom en adresse, votre machine commence par consulter votre fichier host (c'est le cas sous Windows, je ne suis pas sûr pour les autres OS). S'il ne trouve rien, toujours sous Windows, s'il existe une configuration DNS fonctionnelle, alors le serveur DNS sera consulté avant d'interroger le cache NetBIOS. Et tout cela est sollicité par la méthode getByName(...)
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2008, 10h23
  2. Récupérer adresse IP client avec Internet Explorer
    Par samyrentier dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 24/03/2006, 16h41
  3. Affichage de l'adresse d'une chaine avec cout
    Par thierryguilbert dans le forum SL & STL
    Réponses: 4
    Dernier message: 14/03/2005, 16h04
  4. execution d'un prog avec des fichiers multi-class
    Par Ice-B dans le forum Général Java
    Réponses: 2
    Dernier message: 05/08/2004, 11h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo