Domanda

In Java puoi dare il numero zero come singolo parametro per il costruttore Socket o DatagramSocket. Java quindi collega Socket a una porta libera. È possibile limitare la ricerca delle porte a un intervallo specifico?

È stato utile?

Soluzione

Hrm, dopo aver letto i documenti, non penso che tu possa. Puoi associarti a qualsiasi porta, quindi associarlo se non è accettabile o associarlo ripetutamente a una porta nel tuo intervallo fino a quando non riesci. Il secondo metodo sarà più "efficiente".

Sono a disagio per questa risposta, perché è ... inelegante, eppure non riesco a trovare nient'altro: /

Altri suggerimenti

Associare il socket a qualsiasi porta libera è (di solito) una caratteristica del supporto del socket del sistema operativo; non è specifico di Java. Solaris, ad esempio, supporta la regolazione dell'intervallo di porte temporanee tramite il comando ndd . Ma solo root può regolare l'intervallo e influisce sull'intero sistema, non solo sul tuo programma.

Se il regolare comportamento di associazione effimera non soddisfa le tue esigenze, probabilmente dovrai scriverne uno tuo utilizzando Socket.bind ().

Ecco il codice che ti serve:

public static Socket getListeningSocket() {
    for ( int port = MIN_PORT ; port <= MAX_PORT ; port++ )
    {
        try {
            ServerSocket s = new ServerSocket( port );
            return s;      // no exception means port was available
        } catch (IOException e) {
            // try the next port
        }
    }
    return null;   // port not found, perhaps throw exception?
}

Potresti dare un'occhiata al codice java che implementa la funzione che stai utilizzando. La maggior parte delle librerie Java sono scritte in Java, quindi potresti semplicemente vedere quello che ti serve lì.

Supponendo che @Kenster fosse giusto ed è un'operazione di sistema, potresti dover semplicemente iterare su porte cercando di legare a ciascuno o testarlo. Sebbene sia un po 'doloroso, non dovrebbe essere più di poche righe di codice.

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