Question

En Java, vous pouvez indiquer le nombre zéro en tant que paramètre unique pour le constructeur Socket ou DatagramSocket. Java lie alors ce Socket à un port libre. Est-il possible de limiter la recherche de port à une plage spécifique?

Était-ce utile?

La solution

Hm, après avoir lu la documentation, je ne pense pas que vous puissiez le faire. Vous pouvez soit vous connecter à n’importe quel port, puis le lier à nouveau si cela n’est pas acceptable, ou vous lier à plusieurs reprises à un port de votre plage jusqu’à votre réussite. La deuxième méthode sera la plus "efficace".

Cette réponse me rend mal à l'aise, car elle est ... peu élégante, mais je ne trouve rien d'autre non plus: /

Autres conseils

La liaison du socket à n’importe quel port libre est (généralement) une fonctionnalité du support de socket du système d’exploitation; ce n'est pas spécifique à Java. Solaris, par exemple, prend en charge le réglage de la plage de ports éphémères via la commande ndd . Mais seul root peut ajuster la plage et cela affecte tout le système, pas seulement votre programme.

Si le comportement habituel de la liaison éphémère ne vous convient pas, vous devrez probablement écrire le vôtre à l'aide de Socket.bind ().

Voici le code dont vous avez besoin:

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?
}

Vous pouvez consulter le code Java qui implémente la fonction que vous utilisez. La plupart des bibliothèques java sont écrites en Java, vous pouvez donc voir ce dont vous avez besoin.

En supposant que @Kenster ait raison et qu’il s’agisse d’une opération du système, vous devrez peut-être simplement parcourir les ports en essayant de se connecter à chacun d’entre eux ou de les tester. Même si c'est un peu douloureux, cela ne devrait pas être plus que quelques lignes de code.

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