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

Servlets/JSP Java Discussion :

Communication entre servlet, contextes différents


Sujet :

Servlets/JSP Java

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Points : 56
    Points
    56
    Par défaut Communication entre servlet, contextes différents
    Bonjour,

    je souhaiterais faire communiquer deux servlets situées sur 2 contextes différents, et même deux serveurs différents.
    Le but étant d'envoyer un objet sérialisé depuis une servlet vers une autre.

    Voila le code exécuté depuis une servlet mappée sur
    "http://serveur1.ex:8080/source"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    URL url = new URL("http://serveur2.ex:8080/destination");
    URLConnection connexion = url.openConnection();
    connexion.setDoOutput(true);
    ObjectOutputStream fluxsortie = new ObjectOutputStream(connexion.getOutputStream());
    fluxsortie.writeObject(objet);
    fluxsortie.flush();
    Mon problème étant que le doGet de la servlet mappée sur "http://serveur2.ex:8080/destination" n'est pas appelé (pas plus que l'init()).

    Il y a certainement un truc que j'ai pas compris,

    Merci d'avance,
    Rob

  2. #2
    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
    le protocole HTTP, c'est un chouilla plus complexe que d'ouvrir une connexion et balancer la sauce aveuglément dedans

    voir un exemple ici
    http://java.developpez.com/faq/java/...reseau#postUrl

    En l'occurence, dans ton cas, le serveur attends vraissemblablement quelque chose qui ressemble de près ou de loin a la fin de ta requete

  3. #3
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Points : 56
    Points
    56
    Par défaut
    Salut,

    et d'abord merci pour ta réponse rapide.
    C'était peut être un peu audacieux de vouloir directement commencer par envoyer un objet sérialisé, j'ai donc voulu tester l'utilisation d'un envoi d'une paire clef/valeur simple en utilisant GET:

    Code exécuté sur la servlet mappé sur le contexte "source" sur le serveur1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    URL url = new URL("http://serveur2:8080/destination?clef=valeur");
    URLConnection con = url.openConnection();
    ...

    Code de la servlet mappé sur le contexte "destination" sur le serveur2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public void doGet(HttpServletRequest request,
    			HttpServletResponse response) throws IOException {
    System.out.println("Passage dans le doGet");
    }
    Lorsque je saisis l'adresse http://serveur1:8080/destination?clef=valeur sur un navigateur, j'obtiens bien la trace sur ma console, mais rien ne se passe lorsque le premier bloc de code est exécuté.

    Merci d'avance pour vos conseils éclairés,
    Rob

  4. #4
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 100
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    ton System.out.println écrit dans la console en fait.

    si tu peux afficher du code dans ton navigateur il te faudra :

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    PrintWriter out = response.getWriter() ;
    out.write("J'y suis!");

  5. #5
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Points : 56
    Points
    56
    Par défaut
    Salut,

    Merci pour ta réponse.
    Mais pour le moment je ne souhaite pas envoyer de réponse sur le navigateur, je veux bel et bien obtenir une trace sur la console (à terme il y aura mon code métier à la place).

    Mon problème est que je n'arrive pas à accéder à la méthode doGet de ma servlet serveur2:8080/destination en exécutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    URL url = new URL("http://serveur2:8080/destination?clef=valeur");
    URLConnection con = url.openConnection();
    depuis une autre servlet (située sur un autre serveur).

  6. #6
    Membre régulier
    Inscrit en
    Mars 2010
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 100
    Points : 80
    Points
    80
    Par défaut
    ah ok!

    mais alors, que trouves tu dans la console du serveur? un message d'erreur? et sur le navigateur?
    peut on en avoir un aperçu?
    as tu ajouté la redirection de ta servlet dans le fichier web.xml?

    est ce que tu as essayé simplement un :

    Code JAVA : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <a href="/racineApplication/destination?clef=valeur">

  7. #7
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Points : 56
    Points
    56
    Par défaut
    Lorsque je saisis http://serveur2:8080/destination?clef=valeur sur un navigateur, j'ai le résultat escompté, c'est à dire une trace dans ma console.

    Mais lorsque j'exécute, (depuis le serveur1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    URL url = new URL("http://serveur2:8080/destination?clef=valeur");
    URLConnection con = url.openConnection();
    rien ne se passe du coté du doGet de la servlet située sur le serveur 2. Je n'obtiens ni trace ni message d'erreur.

  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
    openconnection ne suffit pas. Tant que tu ne commence pas à lire le inputstream, l'objet URL n'envoie pas la requete. En gros le protocole HTTP GET c'est


    1) ouverture de socket vers port 80 ou autre
    2) client envoie des header du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    GET /machin/truc HTTP/1.1
     
    hostname: www.serveur.com
    if-modified-since: ....
    etc: ....
    <ligne vide>
    3) lecture du résultat

    Quand tu fais un openConnection avec l'URL, ca s'arrête entre 1 et 2 (pour permettre d'envoyer tes headers custom via outputStream , et encore je suis même pas sur que 1 soit réalisé :p )
    Si tu lit le inputstream, URL va envoyer tous les header pour que l'inputstream commence à se remplire

    Coté serveur, tant que 2 n'est pas complet on se fait rien


    Un code correcte serait donc, à priori
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    URL url = new URL("http://serveur2:8080/destination?clef=valeur");
    URLConnection con = url.openConnection();
    con.getInputStream().read(); // lit 1 byte

  9. #9
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 29
    Points : 56
    Points
    56
    Par défaut
    Ok merci beaucoup Tchize_, problème résolu.

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

Discussions similaires

  1. Communication entre servlets via Post Request
    Par fafoula dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 10/12/2007, 10h34
  2. Communication entre Servlets distantes
    Par infotron dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 02/08/2007, 14h19
  3. Réponses: 5
    Dernier message: 23/03/2007, 13h22
  4. communication entre servlet
    Par aboubrams dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 10/11/2006, 14h30
  5. Communication entre servlets
    Par kam81 dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 23/10/2006, 08h44

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