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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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