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 :

Appel d'une servlet


Sujet :

Servlets/JSP Java

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 106
    Par défaut Appel d'une servlet
    Bonjour

    Je voudrais juste faire un test d'un client qui appelle une servlet en utilisant les flux binaires entre les 2.
    Mon client envoie des données binaires dans le flux de la servlet, la servlet "devrait" récupérer ces données binaires et renvoie une réponse au client.
    Je ne sais pas pourquoi ma servlet ne reçoit aucune donnée du client, par contre mon client reçoit bien la réponse de ma servlet.
    Le problème vient-il de mon client ou de la servlet?
    Qu'est ce que j'ai donc bien pu oublier?
    Merci de votre aide

    J'utilise le jdk1.6.0_35 et Tomcat 7.0.29.

    Code du client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    import java.io.*;
    import java.net.*;
     
    public class CallServlet
    {
      public static void main(String[] args) throws Exception
      {
        URL url = new URL("http://localhost:8080/ServletTest/CMSDKServlet");
     
        URLConnection connection = url.openConnection();
     
        connection.setDoInput(true);
        connection.setDoOutput(true);
     
        // envoie des données vers la servlet
        OutputStream out = connection.getOutputStream();
        PrintStream ps = new PrintStream(out);
        ps.println("client appelle servlet");
        ps.close();
     
        // réponse de la servlet
        InputStream in = connection.getInputStream();
        System.out.println("servlet a envoyé "+in.available()); // OK, j'ai bien le nombre d'octets
        in.close();
      }
    }
    Code de la servlet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    import java.io.*;
     
    import javax.servlet.*;
    import javax.servlet.http.*;
     
    public class CMSDKServlet extends HttpServlet
    {
      public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
      {
        doPost(request, response);
      }
     
      public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
      {
        try
        {
            // données du client
            InputStream is = request.getInputStream();
            System.out.println("client a envoyé "+is.available()); // ERROR ici toujours 0
            is.close();
     
            // réponse envoyée au client
            OutputStream respOut = response.getOutputStream();
            PrintStream ps = new PrintStream(respOut);
            ps.println("servlet renvoie une réponse au client");
            ps.close();
     
        }
        catch(Throwable e)
        {
          e.printStackTrace();
          throw new ServletException(msg, e);
        }
      }
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Les servlet s'appuient sur le protocol HTTP.
    Le message envoyé doit donc respecter les règles de ce protocole pour pouvoir être interprété convenablement par HttpServlet.

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 106
    Par défaut
    Bonjour

    Et merci de m'avoir répondu, mais que dois je faire ou changer pour que je puisse utiliser ces flux binaires des 2 cotés?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je vois deux solutions:
    - encapsuler le message binaire dans un paramètre de message HTTP via un encodage/décodage base64 par exemple
    - abandonner le http et donc les servlet et descendre au niveau socket

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 106
    Par défaut
    >encapsuler le message binaire dans un paramètre de message HTTP via un encodage/décodage base64 par exemple
    C'est ce que je pensais faire mais mon flux binaire peut être assez gros et je crois qu'il y a une limite en taille sur les paramètres http.

    >abandonner le http et donc les servlet et descendre au niveau socket
    S'il n'y a pas d'autres solutions, pkoi pas

  6. #6
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    pour balancer des données brutes, utilise un PUT plutot qu'un GET ou un POST, là le serveur s'attends à des données quelconques.

    Par contre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            // données du client
            InputStream is = request.getInputStream();
            System.out.println("client a envoyé "+is.available()); // ERROR ici toujours 0
    JE ne vois pas en quoi 0 est une erreur. Ca indique juste que le client n'a encore rien envoyé. au lieu de faire un is.close(), lit le contenu de is.

    A noter que tu devra passer (par le header Content-Length) la taille de la requete, sinon le serveur ne saura pas quand c'est terminé et ne pourra pas distinguer les différentes requetes.

    coté client, ne cloture pas le stream avant d'avoir lu la reponse. Lors du close, tu perd le contact avec le serveur distant et tu ne saura lire que ce qu'il t'as déjà envoyé.

    Bref d'un coté comme de l'autre, ne joue pas avec la fermeture des stream. Un stream http c'est réutilisable et bidirectionnel. Tu ferme un sens, tu ferme l'autre.

  7. #7
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 106
    Par défaut
    bonjour

    Desolé pour le temps de réponse


    >pour balancer des données brutes, utilise un PUT plutot qu'un GET ou un >POST, là le serveur s'attends à des données quelconques.

    J'avais déjà essayé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
    httpURLConnection.setRequestMethod("POST");
    et
    httpURLConnection.setRequestMethod("PUT");
    mais sans succès

    >JE ne vois pas en quoi 0 est une erreur. Ca indique juste que le client n'a >encore rien envoyé. au lieu de faire un is.close(), lit le contenu de is.
    Vous avez raison, juste que l'exemple donné est simplifié pour les lecteurs, dans ma vraie servlet, j'essaye de lire le contenu du flux mais je n'ai rien.
    Même en mode DEBUG du client et de la servlet ou j'attends dans mon servlet que mon client ait bien envoyé ses données, je n'obtiens aucune donnée.


    Je viens de m'apercevoir que ma servlet est "appelé" lorsque le client fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    InputStream in = connection.getInputStream();
    je croyais que mon servlet était appelé lors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    URLConnection connection = url.openConnection();
    Ce qui peut expliquer pkoi ma servlet ne recoit aucune donnée.
    et dans ce cas, comment faire (s'il y a une solution).

    Merci de votre aide

  8. #8
    Expert éminent
    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 : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Honnetement, si tu veux faire des requetes complexes de ce type là, la classe URL n'est pas la plus appropriée. Utilise commons httpclient, qui est orientée protocole http à tous les niveaux et permet de créer des requetes correctes.

    Ensuite, une fois que la requete est correcte, tu pourra attaquer la servlet

  9. #9
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 106
    Par défaut
    Ok je vais creuser du coté de commons httpclient

    Merci

Discussions similaires

  1. probleme de l'appel d'une servlet
    Par fafoula dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 04/12/2007, 18h01
  2. appel d'une servlet dans un war
    Par fafoula dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 30/11/2007, 09h46
  3. appel d'une servlet avec des parametres
    Par Mickael Scofild dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/08/2007, 11h23
  4. Appel d'une servlet
    Par ptitsoleil87 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 14/02/2005, 11h18
  5. [Debutant(e)]Appel d'une servlet dans une page jsp
    Par kouadjalain dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 20/07/2004, 15h02

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