3
votes

Comment savoir sur quel port écouter un programme

J'écris un programme de chat en utilisant des sockets et Java et je dois spécifier un port sur lequel les serveurs écoutent.

Voici mes questions:

  1. Comment puis-je être sûr que ce port est toujours gratuit?

  2. Est-ce important qu'un autre programme écoute également sur ce port?

  3. Si le port doit être libre et que le port par défaut est occupé, comment est-ce que j'informerais les clients d'un changement de numéro de port?

  4. Dois-je simplement faire en sorte que le serveur continue d'essayer de se lier à un nouveau port, incrémenter le numéro de port jusqu'à ce qu'il trouve un port libre?


0 commentaires

4 Réponses :


5
votes

Comment puis-je être sûr que ce port est toujours gratuit?

Vous pouvez utiliser "netstat" pour vérifier si un port est disponible ou non. Vous pouvez lister tous les ports utilisés par un service via:

netstat -anp

Si vous souhaitez rechercher un port spécifique, vous pouvez utiliser:

netstat -anp | trouver "numéro de port" , par exemple netstat -anp | trouver ": 8080" .

Est-ce important qu'un autre programme écoute également sur ce port?

D'un aspect traditionnel, oui, pour TCP, vous ne pouvez avoir qu'une seule application à l'écoute sur le même port et la même adresse IP locale à la fois. Vous pourrez peut-être utiliser le même port en ayant plusieurs adresses IP locales en utilisant plusieurs cartes réseau ou des interfaces réseau virtuelles.

Cependant, il semble qu'en utilisant l'option de socket SO_REUSEPORT , vous pourrez peut-être la réutiliser, vérifiez this pour plus d'informations.

Si le port doit être libre et que le port par défaut est occupé, comment informer les clients d'un changement de numéro de port? Dois-je simplement faire en sorte que le serveur continue d'essayer de se lier à un nouveau port, en incrémentant le numéro de port jusqu'à ce qu'il trouve un port libre?

Personnellement, je choisirais soit un port qui est toujours gratuit, soit une petite liste de ports que je savais être généralement gratuits et essayer un par un.

Les règles générales pour choisir un port incluent le choix d'au moins un nombre à 4 chiffres et d'éviter tout ce qui est inférieur à 1024. De plus, même si le port était déjà utilisé par un autre service, vous pouvez le réattribuer pour écouter un autre port, son votre réseau après tout.


0 commentaires

1
votes

Inscrivez-vous à l'IANA

Vous pouvez enregistrer votre port auprès de l'IANA. Voici une liste des ports déjà utilisés.

https: // www .iana.org / assignments / noms-de-service-numéros-de-ports / noms-de-services-numéros-de-ports.txt

Vous pourriez penser

hé, je ne suis qu'une seule personne! Je n'aime pas menacer une autorité internationale!

Gardez à l'esprit que:

  1. 90% de tous les ports ne sont pas attribués / réservés.
  2. le site Web http://mobrien.com/ a enregistré le port 2031 et la personne qui a enregistré le port est une personne privée et même pas un programmeur (et déjà décédée aujourd'hui peut-être).

0 commentaires

4
votes

Pouvez-vous décrire l'architecture que vous essayez de construire? Où gérez-vous votre serveur et vos clients?

Mes suggestions sont:

  1. Utilisez un seul port constant et configurez le serveur Web (par exemple - nginx) pour acheminer les requêtes vers ce port en fonction du domaine. Les clients n'auront pas besoin de connaître les ports - domaine uniquement. De plus, cela permettra de ne pas exposer tous les ports au réseau - seulement ceux qui sont nécessaires (80, 443).

  2. Au démarrage, essayez de détecter un port libre (appelez netstat ou incrémentez simplement le numéro de port jusqu'à ce que le service soit activé), stockez le numéro de port dans un fichier local. Envoyez ce fichier local à l'aide du serveur Web, par exemple. nginx - toujours 80 ou 443 port - en tant que données statiques. Les clients obtiendront d'abord le numéro de port par l'URL statique, puis se connecteront à un port fourni.

  3. Utilisez un service de noms - par exemple - Spring Cloud - exécutez-le sur un serveur séparé. Découvrez le port gratuit au démarrage de l'application, enregistrez-le dans le service de nommage. Les clients demanderont toujours le service de dénomination en premier. Vous pouvez également utiliser simplement un équilibreur simple (par exemple, AWS Elastic Balancer + AWC EC2).

  4. Utilisez Kubernetes - configurez un «service» sur un port spécifique et exécutez n'importe quel nombre de vos instances d'application dans des pods - les ports libres seront détectés automatiquement.

P.s. Vous ne pouvez pas exécuter plusieurs applications sur un seul port. Il est fort probable que cela ne démarre même pas.


0 commentaires

2
votes

Si c'est votre serveur sur lequel le programme s'exécute, ils vous devez décider quel port utiliser et vous assurer qu'il est disponible (c'est-à-dire non utilisé par un autre programme). Pour vérifier cela, essayez simplement de bind () votre ServerSocket sur ce port. Si vous obtenez une IOException , le port est probablement déjà utilisé (avec Linux, vérifiez la sortie de netstat -anp | grep pour vérifier quel programme l'utilise ).

Si vous ne voulez / ne pouvez pas utiliser un port fixe, vous pouvez toujours vous lier au port 0 , qui attribuera automatiquement un port libre. Ensuite, vous pouvez obtenir le port attribué avec getLocalPort () .

Cependant, pour que les clients puissent se connecter à votre serveur (qui fonctionne sur un port «flottant»), vous devez en faire la publicité, par exemple via JNDI (préféré en Java), LDAP, ... ( voir @Azee answer pour des exemples).

En remarque, sachez que les options TCP SO_REUSEADDR / SO_REUSEPORT n'ont pas la même signification , selon le système d'exploitation que vous utilisent (sans parler de leur (non) disponibilité).


0 commentaires