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

Java Discussion :

Ecouter le port 8080 d'Apache "Address already in use"


Sujet :

Java

  1. #1
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut Ecouter le port 8080 d'Apache "Address already in use"
    Bonjour,

    J’ai une application Web hébergée sur un serveur Apache Tomcat, qui tourne sur le port 8080.
    Je souhaite développer un petit programme Java qui « écoute » ce port 8080, de manière à intercepter toutes les requêtes qui partent de mon application Web.
    Lorsque je lance mon programme d’écoute, je tente donc d’écouter le port 8080 de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ServerSocket interceptorSocket = new ServerSocket(8080);
    Mais j’ai une exception :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception: java.net.BindException: Address already in use: JVM_Bind
    Et oui, en effet le port est déjà utilisé par Apache mais c’est le but ! Je veux justement écouter tout ce qui passe par l’application qui tourne sur ce port !
    Donc je ne comprends pas comment faire, il y a certainement un principe que je n'ai pas compris. Est-ce que j’utilise la bonne méthode en utilisant une « ServerSocket » ? Y’a-t-il un meilleur moyen de procéder ?

    Merci d’avance

    Dany

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par danyboy85 Voir le message
    Est-ce que j’utilise la bonne méthode en utilisant une « ServerSocket » ?
    Carrément pas. ServerSocket sert à créer une socket serveur capable de recevoir des connexions entrantes.

    Toi tu cherches à espionner ce qui passe par une socket serveur qui existe déjà (en l'occurrence celle de Tomcat sur 8080)

    Citation Envoyé par danyboy85 Voir le message
    Y’a-t-il un meilleur moyen de procéder ?
    Vu que c'est du Tomcat il doit y avoir moyen de configurer une Valve qui sera prévenue pour chaque requête et qui te permettrait de vérifier son contenu.

    Mais ce serait peut-être plus simple avec une bibliothèque d'espionnage réseau comme jpcap.

    Après, ça dépend de ton besoin précis. Là j'ai parlé du cas général pour pouvoir espionner absolument tout et faire absolument tout ce qu'on veut.
    Mais pour tout ce qui est utile, Tomcat et Java prévoient déjà des trucs tout faits pour le faire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Alors, le besoin exact consiste à intercepter toutes les requêtes HTTP passant sur un port (en l’occurrence 8080), d'en modifier l'entête (le Header) et de les renvoyer.

    Penses-tu que la librairie que tu indiques permet de faire cela ?

    Sans passer par une librairie, quel objet plus adapté qu'une socket permettrait de faire cela ?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 095
    Par défaut
    réponse courte : avec 2 sockets (un peu comme JumpGate)

    Donc faire "un pont", je m'explique :

    C'est a dire, ouvrir une socket (sur le port 8081 qui est libre) par exemple.

    Puis ouvrir une 2 ème socket pour se connecter au port 8080 du tomcat quand nécessaire.

    L'idée étant de faire écouter à la première socket pour retransmettre sur la 2 eme socket. (et eventuellement faire quelques choses de ce qui passe entre les sockets).

    Mais je ne suis pas certain de la faisabilité en fait.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Je ne comprends pas vraiment.
    Si je me mets en écoute sur le port 8081 :

    ServerSocket interceptorSocket = new ServerSocket(8081);
    interceptorSocket.accept();

    Je vais rester en attente sur la ligne "interceptorSocket.accept();" et puis il ne se passera plus rien car mes requêtes passent sur le port 8080.

  6. #6
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 095
    Par défaut
    Mais si tu comprends quand même un peu

    Mais tu as 2 possibilités pour régler ce "problème" de double usage de port qui n'est possible :

    1) utiliser Tomcat sur le port 8080 et le programme java sur 8081. Mais alors le client devra tapper le bon port dans l'url ce qui n'est pas transparent.
    2) modifier le port de tomcat pour utiliser 8081 et utiliser 8080 en java. La l'utilisateur ne verras pas de différence.

    Mais bon ce que thelvin disait me semblait quand même mieux et moins chipotte foireuse mais je n'ai aucune idée de comment mettre cela en place :
    Citation Envoyé par thelvin
    Vu que c'est du Tomcat il doit y avoir moyen de configurer une Valve qui sera prévenue pour chaque requête et qui te permettrait de vérifier son contenu.
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre éclairé Avatar de danyboy85
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 548
    Par défaut
    Ok en tâtonnant j'ai trouvé la solution, qui n'était pas si compliquée :

    Il suffit de définir un proxy dans la configuration de Tomcat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="900000" 
                   redirectPort="8443"
    			   proxyName="localhost"
    			   proxyPort="8888" />
    Ensuite, je fais tourner mon programme d'interception des requêtes sur le port 8888. J'intercepte donc toutes mes requêtes, je fais mon traitement, et je les rebalance sur le port 8080

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Merci pour l'info, je ne connaissais pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Sockets] Erreur 98 "address already in use"
    Par iReNu dans le forum Réseau/Web
    Réponses: 6
    Dernier message: 17/04/2009, 17h27
  2. Bind(): address already in use
    Par adesport dans le forum Réseau
    Réponses: 3
    Dernier message: 18/01/2009, 12h27
  3. address already in use
    Par sleigh dans le forum Administration système
    Réponses: 0
    Dernier message: 14/09/2007, 10h03
  4. Bind Exception: Address already in use: connect
    Par metalcoyote dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 19/06/2007, 09h55
  5. Address already in use
    Par horkets dans le forum Réseau
    Réponses: 4
    Dernier message: 29/10/2006, 21h08

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