créer une application client-serveur en Java où les deux machines peuvent avoir des adresses IP dynamiques

StackOverflow https://stackoverflow.com/questions/3697878

  •  02-10-2019
  •  | 
  •  

Question

est ce que je prévois de faire. Supposons qu'il y ait 2 machines A et B. Je dois créer une application par laquelle la machine A peut envoyer des données à la machine B, en utilisant Java SE.

Je sais que pour établir une connexion, vous devez créer un objet de classe ServerSocket et utiliser la méthode accept () comme

Dans la machine B: ServerSocket ss = new ServerSocket (12000);

while (true)

{

Socket s = ss.accept ();

      .
      .
      .
      .

}

Dans la machine A:

Socket = new Socket ( "<< strong> Adresse IP de la machine B >", 12000);

                .
                .
                .
                .

Voici le problème.

Supposons que si adresse IP de la machine B est affectée dynamiquement avec DHCP , par exemple, il peut changer à chaque redémarrage de la machine.

Y at-il moyen par lequel Java MGP machine A peut reconnaître l'adresse IP de B sans la saisie de l'utilisateur manuellement ???

En espérant que vous la question est claire. En attente de réponses!

Était-ce utile?

La solution

La plupart des serveurs DNS ont un mécanisme qui permet au serveur DHCP pour faire des mises à jour dynamiques à la zone locale (interne). Si vous avez cette fonctionnalité à votre disposition, vous pouvez simplement utiliser les noms DNS, et que les systèmes gars assurez-vous que les enregistrements DNS sont à jour avec les baux DHCP.

Une approche basée sur le DNS similaire pourrait être réalisée sur Internet plus large en utilisant un service DDNS comme DynDNS .

Si vous ne pouvez pas utiliser le DNS, alors vous êtes coincé avec une approche basé sur la diffusion UDP. Ceci est le même mécanisme que les protocoles comme DHCP, Bonjour, et l'utilisation de SMB pour trouver d'autres ordinateurs sur le réseau local sans connaître leurs adresses; et cette approche ne fonctionnera que dans les mêmes contextes où les travaux des technologies (en général, que dans le réseau local, et certainement pas dans plus Internet).

En Java, vous accompliriez la messagerie de diffusion UDP via la classe de DatagramSocket.

Citant les docs api:

  

diffusions UDP envoie sont toujours activés sur un DatagramSocket. Pour recevoir des paquets de diffusion d'un DatagramSocket doit être lié à l'adresse générique. Dans certaines implémentations, les paquets de diffusion peuvent également être reçues lorsqu'un DatagramSocket est lié à une adresse plus précise.

     

Exemple:

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress(8888)); 
     

Ce qui équivaut à:

DatagramSocket s = new DatagramSocket(8888); 
     

Les deux cas va créer un DatagramSocket capable de recevoir des émissions sur le port UDP 8888. \

Si vos deux machines sont situées à des endroits différents sur Internet, et vous ne pouvez pas utiliser un service DDNS (DynDNS comme mentionné ci-dessus), alors votre meilleur pari est de construire un serveur d'enregistrement central. Ce serait un simple serveur (pourrait même être un service web) qui fonctionne à une adresse connue sur Internet. Chacun de vos machines clientes enregistrerait avec le serveur central d'enregistrement, ainsi le serveur d'enregistrement central sauriez les adresses IP des deux machines. Ensuite, chaque machine pourrait demander à l'autre adresse via le serveur central d'enregistrement. Il faudrait mettre une certaine pensée dans la sécurité afin de protéger contre les malveillants « empoisonnement » de votre registre, mais sinon, ce serait assez simple.


EDIT:

Je viens de découvrir JXTA . Il est un ensemble d'outils pour créer des applications Java avec des fonctionnalités de réseau peer-to-peer. Je n'ai aucune expérience directe avec elle, mais il semble que ce serait accomplir ce que vous cherchez (et probablement vous faire économiser beaucoup de travail au cours d'avoir à construire tout à partir de zéro).

En fait, il semble que le sous-projet p2psockets fait exactement ce que vous voulez.

Autres conseils

Dans Java, vous pouvez calculer l'adresse IP de la machine par le nom d'hôte, voici le code

 java.net.InetAddress inetAdd = java.net.InetAddress.getByName("www.ibm.com");
 System.out.println("IP Address is : " + inetAdd.getHostAddress());

Utilisez ce code pour obtenir l'adresse IP a changé tous les redémarrages de machine à temps

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top