creare un'applicazione client-server in java, dove entrambe le macchine possono avere indirizzi IP dinamici

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

  •  02-10-2019
  •  | 
  •  

Domanda

Questo è quello che ho intenzione di fare. Supponiamo che ci siano 2 macchine A e B. Ho bisogno di creare un'applicazione con la quale la macchina A può inviare dati a macchina B, usando Java SE.

Lo so che per fare una connessione è necessario creare un oggetto della classe ServerSocket e utilizzare il metodo accept () come

In macchina B: ServerSocket ss = new ServerSocket (12000);

while (true)

{

Socket s = ss.accept ();

      .
      .
      .
      .

}

In macchina A:

Socket s = new Socket ( "<< strong> della macchina B Indirizzo IP >", 12000);

                .
                .
                .
                .

Ecco il problema.

Si supponga che, se indirizzo IP della macchina B è assegnato in modo dinamico con DHCP , vale a dire che possono cambiare ogni volta che si riavvia macchina.

C'è un modo con cui il Pgm Java in macchina A in grado di riconoscere l'indirizzo IP di B senza l'utente che digita manualmente ???

sperando che la questione è chiara. In attesa di risposte!

È stato utile?

Soluzione

La maggior parte dei server DNS hanno un meccanismo che consente al server DHCP per fare aggiornamenti dinamici alla zona locale (interno). Se si dispone di questa funzionalità a disposizione, allora si può solo utilizzare i nomi DNS, e lasciare che i sistemi di ragazzi fanno in modo che i record DNS sono up-to-date con il lease DHCP.

Un approccio basato su DNS simile potrebbe essere realizzato su internet più ampio utilizzando un servizio DDNS come dyndns .

Se non è possibile utilizzare DNS, allora sei bloccato con un approccio basato trasmissione UDP. Questo è lo stesso meccanismo che protocolli come DHCP, Bonjour, SMB e l'uso per trovare altri computer della rete locale senza conoscere i loro indirizzi; e questo approccio sarà solo lavoro negli stessi contesti in cui le tecnologie di lavoro (in genere, solo all'interno della rete locale, e sicuramente non in tutto il maggiore Internet).

In Java, si dovrebbe realizzare UDP messaggistica trasmissione tramite il DatagramSocket classe.

Citando la documentazione API:

  

trasmissioni UDP manda sono sempre abilitato su un DatagramSocket. Al fine di ricevere pacchetti di broadcast un DatagramSocket deve essere associato all'indirizzo jolly. In alcune implementazioni, pacchetti broadcast possono essere ricevuti anche quando un DatagramSocket è associato a un indirizzo più specifico.

     

Esempio:

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

che è equivalente a:

DatagramSocket s = new DatagramSocket(8888); 
     

In entrambi i casi creerà un DatagramSocket in grado di ricevere le trasmissioni sulla porta UDP 8888. \

Se le due macchine si trovano in posizioni diverse su internet, e non è possibile utilizzare un servizio DDNS (come DynDNS, di cui sopra), allora la cosa migliore è quello di costruire un server di registrazione centrale. Questo sarebbe un semplice server (potrebbe anche essere un servizio web) che funziona a un indirizzo conosciuto su internet. Ognuna delle vostre macchine client potrebbe registrarsi con il server di registrazione centrale, quindi il server di registrazione centrale sarebbe conoscere gli indirizzi IP di entrambe le macchine. Poi ogni macchina potrebbe richiedere l'indirizzo del loro tramite il server di registrazione centrale. Dovreste mettere qualche pensiero in per la sicurezza al fine di proteggere contro il maligno "avvelenamento" del registro di sistema, ma per il resto, questo sarebbe abbastanza semplice.


EDIT:

Ho appena scoperto JXTA . Si tratta di un insieme di strumenti per la creazione di applicazioni Java con funzionalità di rete peer-to-peer. Non ho alcuna esperienza diretta con esso, ma sembra che sarebbe realizzare quello che stai cercando (e probabilmente risparmiare un sacco di lavoro rispetto a dover costruire tutto da zero).

In realtà, sembra che il sottoprogetto p2psockets fa esattamente ciò che si desidera.

Altri suggerimenti

In Java è possibile calcolare l'indirizzo IP della macchina in base al nome dell'host, Ecco il codice

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

Usa questo codice per ottenere l'indirizzo IP modificato ogni macchina del tempo riavvii

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top