IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Socket: Utilisation d'un port plusieurs fois de suite


Sujet :

Entrée/Sortie Java

  1. #1
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut Socket: Utilisation d'un port plusieurs fois de suite
    Bonjour,

    Dans un programme java, j'utilise la classe Socket pour envoyer des messages a des clients, via ce constructeur:

    Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

    J'utilise plusieurs fois de suite le meme port "localPort" dans une boucle d'envoi de message, et de temps en temps j'obtiens l'exception java.net.BindException: Address already in use

    Aprés analyse des ports sur ma machine locale, effectivement même aprés fermeture du socket le port reste ouvert quelques temps en mode Wait je crois, meme en utilisant les méthodes setReuseAddress(true), setKeepAlive(false) de la classe Socket.

    Est il donc possible de réutiliser plusieurs fois le meme port pour l'envoi de message via les sockets ?

    Merci

  2. #2
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 575
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu fermes bien tes socket avec close() une fois que tu as fini de les utiliser? Si tu compte sur le Garbage collector pour les libérer, ça ne sera en effet pas immédiat.

  3. #3
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut
    Effectivement j'utilise bien la méthode close(), et je vois bien l'état du port changer dans windows de Open en TimeWait qq chose comme ca, meme si celui reste qd meme dans la liste des ports ouvert.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Tu as défini le SO_LINGER? Ce paramètre spécifie combien de temps attendre pour que la fermeture soit effective. Une demande de close d'un socket, c'est comme la transmission de données, c'est mis en queue sur l'OS. Par défaut, au retour de l'appel à close, la socket n'est pas nécessairement déjà fermé. Avec un SO_LINGER, tu peux définir un délai d'attente propre avant de tuer la socket violement. Au moins t'es certain qu'elle est libre après.

  5. #5
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut
    Ah effectivement, par contre j'ai lu que c'est "pas bien" d'utiliser cette technique. Mais si le port ne se termine pas de lui même c'est qu'a priori mon programme gère mal cette partie la.

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Si j'ai bin compris, le so_linger consiste juste à rendre bloquant le close()

    Maintenant, réutiliser vite le port n'est peut être pas une bonne idée, surtout si tu te reconnecte au même destinataire. Lui pourrait être confus quand à savoir si tes nouveaux paquet font partie de l'ancienne connexion ou d'une nouvelle, entrainant l'échange de paquets "reset" et une perte de perf le temps de remettre la nouvelle communication sur les rails.

  7. #7
    Membre habitué
    Inscrit en
    Septembre 2002
    Messages
    233
    Détails du profil
    Informations forums :
    Inscription : Septembre 2002
    Messages : 233
    Points : 131
    Points
    131
    Par défaut
    Effectivement ca semble ne pas etre une bonne idée de réutiliser ce port, en fait c'est pour des envois vers des clients bien distincts mais ce n'est pas une bonne idée je pense.

    J'avais mis cette option pour faciliter le paramétrage du serveur au niveau des firewall, mais finalement je me demande si le port local d'envoi de message est bien bloqué par les firewall ? Si oui ca voudrait dire que je ne peux pas utiliser pleins de ports différents mais une série de port bien définie.

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Il est rare d'avoir un firewall qui limite les ports interne lorsque la connexion viens de l'intérieur. Et pour cause, la majorité des applications utilisent des ports aléatoire coté client. Le firewall utilise soit le port distant, soit le protocole pour filtrer.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2014, 01h17
  2. [2.x] Utiliser le même formulaire plusieurs fois dans la même page
    Par Daecarios dans le forum Symfony
    Réponses: 3
    Dernier message: 06/07/2012, 14h53
  3. Utilisation d'un step plusieurs fois, dans un jcl
    Par twisty dans le forum JCL - SORT
    Réponses: 16
    Dernier message: 13/04/2011, 14h35
  4. utilisation de script js plusieurs fois dans une même page
    Par tribalnanasss dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/07/2010, 00h34
  5. stringstream utilisé plusieurs fois de suite
    Par mamelouk dans le forum SL & STL
    Réponses: 19
    Dernier message: 16/08/2007, 08h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo