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 :

Proxy. Y a t il plus simple?


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut Proxy. Y a t il plus simple?
    tout est dans le titre. Le but de ce bout de code est de récuperer la réponse du serveur et de la transmettre au client.

    Bien entendu, dans un futur proche, il y aura des modifs dans le contenu de la réponse avant d'envoyer au client.

    Ca marche bien, mais je pense qu'il existe plus simple. Je me trompe?

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     // recupere la reponse du serveur et la transmet au client.
     private boolean transfererReponseServeurAuClient() {
      InputStream  inputStreamServeur = null;
      OutputStream outputStreamClient = null;
      String headerReponseServeur = "";
      String contentReponseServeur = "";
     
      try {
       inputStreamServeur  = socketServeur.getInputStream();
      }
      catch (Exception e) {
       System.out.println("ProxyConnection.transfererReponseServeurAuClient: Erreur ouverture inputStream socket Serveur - " + e.getMessage() + ". FIN PROCESSUS");
       log.addMessage("ProxyConnection.transfererReponseServeurAuClient - Erreur ouverture inputStream socket Serveur", e.getMessage());
       log.addMessage("ProxyConnection.transfererReponseServeurAuClient", "FIN PROCESSUS");
       closeSocket(socketClient);
       return false;
      }
     
      try {
       outputStreamClient = socketClient.getOutputStream();
      }
      catch (Exception e) {
       System.out.println("ProxyConnection.transfererReponseServeurAuClient: Erreur ouverture outputStream socket Client - " + e.getMessage() + ". FIN PROCESSUS");
       log.addMessage("ProxyConnection.transfererReponseServeurAuClient - Erreur ouverture outputStream socket Client", e.getMessage());
       log.addMessage("ProxyConnection.transfererReponseServeurAuClient", "FIN PROCESSUS");
       closeSocket(socketServeur);
       return false;
      }
     
      try {
       byte onebyte[] = new byte[1];
       boolean end = false;
     
       // recuperation du header, byte par byte.
       // on determine la fin avec _CRLF2.
       // on transfert directement les donnees au client.
       while(!end) {
        if(inputStreamServeur.read(onebyte) <= 0) {
         end = true;
         continue;
        }
        else {
         headerReponseServeur += new String(onebyte, "8859_1");
         outputStreamClient.write(onebyte, 0, onebyte.length);
        }
     
        if(headerReponseServeur.endsWith(_CRLF2))
         end = true;
       }
     
       outputStreamClient.flush(); 
     
       System.out.println("ProxyConnection.recupererRequeteServeur: header:\n" + headerReponseServeur);
     
       // recuperation du contenu, byte par byte.
       // on transfert directement les donnees au client.
       // si le contenu est vide, alors une exception silencieuse est levee.
       end = false;
       while(!end) {
        if (inputStreamServeur.read(onebyte) <= 0) {
         end = true;
         continue;
        }
        else {
         contentReponseServeur += new String(onebyte, "8859_1");
         outputStreamClient.write(onebyte, 0, onebyte.length);
         System.out.println("ProxyConnection.recupererRequeteServeur contenu:\n" + contentReponseServeur);
        }
       }
     
       outputStreamClient.flush();
     
       System.out.println("ProxyConnection.recupererRequeteServeur contenu:\n" + contentReponseServeur);
     
       return true;
      }
      catch (Exception e) {
       System.out.println("ProxyConnection.transfererReponseServeurAuClient: " + e.getMessage() + ". FIN PROCESSUS");
       log.addMessage("ProxyConnection.transfererReponseServeurAuClient", e.getMessage());
       log.addMessage("ProxyConnection.transfererReponseServeurAuClient", "FIN PROCESSUS");
       closeSocket(socketClient);
       closeSocket(socketServeur);
       return false;
      }
     }

  2. #2
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Le code est si compliqué?
    Au fait _CRLF2 = "\n\n";

    Par contre, cela me génére une erreur à chaque fois:

    ProxyConnection.transfererReponseServeurAuClient: read time out. FIN PROCESSUS




    Merci pour votre éventuelle aide...

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2006
    Messages : 124
    Par défaut
    J'avoue que je ne comprends pas grand-chose... mais comme personne ne répond je vais demander quelques éclaircissements.

    Tu veux récupérer une réponse... mais quelle réponse?

    Lorsque le client envoie une requête (post, get, etc) à ton serveur, la réponse du serveur c'est toi qui la crée... ta requête va "activer" un fichier java chargé d'aller chercher des infos par-ci par-là (base de données, fichiers, mémoire, etc) puis de renvoyer le résultat au client.

    A mon avis ton problème c'est:
    1) réceptionner la requête du client
    2) créer la réponse en fonction de la requête
    3) envoyer la réponse (bref répondre...)

    Je crois que ton problème n'a pas été expliqué correctement mais je suis pas sûr. A mon avis dire que tu veux "récuperer la réponse du serveur et la transmettre au client" c'est pas juste. Tu veux plutôt créer la réponse et l'envoyer au client.

    J'espère avoir bien compris ce que tu voulais faire.

    Remarque: je ne sais pas pourquoi tu parles de proxy dans le titre et pas dans ton sujet...

  4. #4
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Je vais détailler un peu. Effectivement, ce n'est pas très clair!!
    Mon application est un proxy dont j'ai fixé l'adresse et le port.

    La classe principale se met à l'attente de clients. Voici un bout de code que j'espère significatif:

    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
     public void run() {
      System.out.println("ProxyServer.run: Demarrage");
      while(serveurRunning) {
        System.out.println("ProxyServer.run: ...A l'ecoute des clients...");
     
        try {
         Socket socket = serveurSocket.accept();
     
         System.out.println("ProxyServer.run: ...Connection d'un client au proxy...");
         log.addMessage("ProxyServer.run: Connection du client au proxy.");
     
         new ProxyConnection(socket, log);
        }
        catch(Exception e) {
         System.out.println("ProxyServer.run: " + e.getMessage());
         log.addMessage("ProxyServer.run", e.getMessage());
        }
       } else {
        try {
         thread.sleep(500);
        } catch (Exception e) {
         System.out.println("ProxyServer.run: " + e.getMessage());
         log.addMessage("ProxyServer.run", e.getMessage());
        }
       }
     }

    Dans un formulaire HhTML, j'ai redirigé une requete bidon avec action="monIp:9999". Lorsque on clique sur le bouton submit, la requete HTTP est récupérée par mon application et subit un traitement avanrt d'etre envoyé sur un autre serveur. Ensuite, on attend la réponse du serveu et on la transmet au client!


    Ainsi, dans ProxyConnection, on a le traitement suivant:

    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
     
    public class ProxyConnection extends Thread {
     private Socket socketClient;
     private Socket socketServeur;
     private Log log = null;
     static final String _CRLF  = "\r\n";
     static final String _CRLF2 = "\r\n\r\n";
     static final String _LF    = "\n";
     static final String _LF2   = "\n\n";
     
     
     ProxyConnection(Socket socket, Log log) {
      this.socketClient = socket;
      this.log = log;
     
      this.start();
     }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     public void run() {
      HttpRequest requeteClient = recupererRequeteClient();
      requeteClient = bidouillerRequeteClient(requeteClient);
          String adresseServeur = "http:://www.google.com";
      int portServeur = 80;
      envoyerRequeteClientAuServeur(adresseServeur, portServeur, requeteClient);
      transfererReponseServeurAuClient();
          closeSocket(socketServeur);
      closeSocket(socketClient);
     }


    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
     
    public class HttpRequest {
      private String header = null;
      private String content = null;
      public HttpRequest() {
      }
      public HttpRequest(String header, String content) {
        this.header = header;
        this.content = content;
      }
      public void setHeader(String header) { this.header = header; }
      public String getHeader() { return header; }
      public void setContent(String content) { this.content = content; }
      public String getContent() { return content; }
    }

  5. #5
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Vu qu'on est jamais mieux servi que par soit même, j'ai finalement trouvé une alternative pour régler mon problème:

    1) Je garde ce code, même si je pensais qu'il existait une surcouche plus conviviale à utiliser (ce n'est pas réellement une solution, mais le prjet doit avancer malgré tout )
    2) Mon pb du "read time out" a été résolu en utilisant le champ "CONTENT-LENGTH" du header de la requette HTTP. En effet, en utilisant cette valeur, je sais combien de caractères il faut lire dans le flux d'entrée.

    Merci à ceux qui ont pris le temps d'essayer de comprendre ce charabia

    Cordialement,


    Billy

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

Discussions similaires

  1. [layout]il existe pas des layout plus simple et plus rapide?
    Par soad dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 28/11/2005, 11h03
  2. Comment faire plus simple
    Par mobscene dans le forum Langage
    Réponses: 5
    Dernier message: 26/07/2005, 04h12
  3. Réponses: 10
    Dernier message: 24/05/2005, 14h09
  4. Pipes => pas plus simple ?
    Par Jorus dans le forum MFC
    Réponses: 4
    Dernier message: 02/02/2005, 17h53
  5. Format date : y'a forcément plus simple...
    Par ZERS dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/12/2004, 15h28

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