211 votes

Comment trouver un port disponible?

Je veux démarrer un serveur qui écoute un port. Je peux spécifier le port explicitement et cela fonctionne. Mais je voudrais trouver un port de manière automatique. À cet égard, j'ai deux questions.

  1. Dans quelle plage de numéros de port dois-je rechercher? (J'ai utilisé les ports 12345, 12346 et 12347 et c'était bien).

  2. Comment savoir si un port donné n'est pas occupé par un autre logiciel?

298voto

Graham Edgecombe Points 1360

Si le port utilisé ne vous dérange pas, spécifiez un port de 0 pour le constructeur ServerSocket et celui-ci écoutera n'importe quel port libre.

 ServerSocket s = new ServerSocket(0);
System.out.println("listening on port: " + s.getLocalPort());
 

Si vous souhaitez utiliser un ensemble spécifique de ports, le moyen le plus simple consiste probablement à les parcourir jusqu'à ce que l'un d'entre eux fonctionne. Quelque chose comme ça:

 public ServerSocket create(int[] ports) throws IOException {
    for (int port : ports) {
        try {
            return new ServerSocket(port);
        } catch (IOException ex) {
            continue; // try next port
        }
    }

    // if the program gets here, no port in the range was found
    throw new IOException("no free port found");
}
 

Pourrait être utilisé comme suit:

 try {
    ServerSocket s = create(new int[] { 3843, 4584, 4843 });
    System.out.println("listening on port: " + s.getLocalPort());
} catch (IOException ex) {
    System.err.println("no available ports");
}
 

60voto

Maurice Perry Points 18154

Si vous transmettez 0 comme numéro de port au constructeur de ServerSocket, il attribuera un port pour vous.

34voto

Andy Johnson Points 4683

Selon Wikipedia , vous devriez utiliser les ports 49152 à 65535 si vous n'avez pas besoin d'un port "bien connu".

Autant que je sache, le seul moyen de déterminer si un port est utilisé est d’essayer de l’ouvrir.

11voto

jopa Points 800

Le kit de développement logiciel Eclipse contient une classe SocketUtil , qui fait ce que vous voulez. Vous pouvez consulter le code source de CVS.

7voto

f1sh Points 2242

Voir http://java.sun.com/j2se/1.4.2/docs/api/java/net/ServerSocket.html#ServerSocket%28int%29.

Crée un socket de serveur, lié au port spécifié. Un port de 0 crée un socket sur n'importe quel port libre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X