HTTP server - PrintWriter BufferedReader

HTTP server - PrintWriter BufferedReader - Java - Programmation

Marsh Posté le 01-04-2005 à 10:10:21    

Salut tout le monde!
 
J'écris un petit serveur http qui prend les requêtes à partir du browser et qui les transmet sur internet. Ensuite, le serveur prend la réponse d'internet et la transfère au browser. (Le but du programme est de modifier le code html reçu avant de le donner au browser mais ce n'est pas encore développé....)
 
En gros, le serveur fonctionne... Mais j'ai des problèmes avec les images: elles sont toutes formées de gros carrés quand elles veulent bien apparaitre. Si vous essayez le code, vous vous en rendrez compte tout de suite. Vous devez juste modifier les parametres de connexion d'internet explorer: proxy server 127.0.0.1 et port 12345 et bien sûr lancer le code java...
 
En fait, j'ai l'impression que les données que je recois sont modifiées quand je les transmet au browser, pourtant je ne modifie pas les streams. Est-ce que j'utilise mal les streams? Est-ce que je rajoute des \r\n au mauvais endroit? Ca fait un bon moment que je cherche et je ne parviens pas à résoudre le problème!
 
 
Si quelqu'un a une idée, je suis preneur!
Merci d'avance
Clabecq
 
 

Citation :

import java.io.*;
import java.net.*;
 
class test {
 
 private static Socket socket, socketToWeb;
 private static BufferedReader fromBrowser, fromWeb;
 private static PrintWriter toBrowser, toWeb;
 public static int port = 12345;
 private static ServerSocket s;
 public static void main(String[] args) throws IOException {
 
  s = new ServerSocket(port);
 
  while (true) {
 
   try {
 
    socket = s.accept();
 
    //ouverture des flux entrants et sortants du socket
    fromBrowser = new BufferedReader(new InputStreamReader(socket
      .getInputStream()));
    toBrowser = new PrintWriter(new BufferedWriter(
      new OutputStreamWriter(socket.getOutputStream())), true);
 
    String str, targetHost = "", httpHeader = "";
    while (true) {
     
     str = fromBrowser.readLine();
     httpHeader += str + "\r\n";
     if (str.startsWith("Host: " )) // On recupere l'host pour savoir ou le socket doit se connecter.
      targetHost = str.substring(6);
     if (str.length() == 0)
      break;
    }
 
    socketToWeb = new Socket(InetAddress.getByName(targetHost), 80);// connexion d'un nouveau socket au site web
    System.out.println("HOST: " + targetHost);
     
     
    // ouverture des flux entrants et sortants du socket connecte au site web.
    fromWeb = new BufferedReader(new InputStreamReader(socketToWeb
      .getInputStream()));
    toWeb = new PrintWriter(new BufferedWriter(
      new OutputStreamWriter(socketToWeb.getOutputStream())),
      true);
 
    toWeb.println(httpHeader); // envoi de la requete au site web
 
    String answer = "";
 
    while (true) {
     str = fromWeb.readLine();
     if (str == null)
      break;
     answer += (str + "\r\n" );
     // reception de la reponse du site web.
    }
 
    toBrowser.println(answer); // envoi des données recues au browser.
    socket.close();
    socketToWeb.close();
   } catch (Exception e) {
   }
  }
 }
}
 

Reply

Marsh Posté le 01-04-2005 à 10:10:21   

Reply

Marsh Posté le 01-04-2005 à 11:44:50    

Bin les Writers et les Readers, c'est fait pour lire des char, pas des bytes. Donc si t'essaies de passer des données de type binaire via ce genre de tuyau, y a des chances pour qu'il y ait des casts à la con dans un coin qui foutent la grouille [:spamafote]


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 01-04-2005 à 12:07:37    

Taiche a écrit :

Bin les Writers et les Readers, c'est fait pour lire des char, pas des bytes. Donc si t'essaies de passer des données de type binaire via ce genre de tuyau, y a des chances pour qu'il y ait des casts à la con dans un coin qui foutent la grouille [:spamafote]


encodages/decodages :o


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 01-04-2005 à 12:12:52    


Bin j'pensais surtout au passage byte -> char qui est pas forcément recommandé dans le cadre des images et autres fichiers binaires. Maintenant, je sais pas trop comment fonctionnent les Writers/Readers, donc je m'avance pas trop dans l'hypothèse :o


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 01-04-2005 à 12:22:07    

ben ils font plus que du cast de byte en char quoi [:joce]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 01-04-2005 à 12:24:13    

Oui non mais d'accord, mais y a pas de méthode de PrintWriter qui prenne de byte en entrée, non ? Bon bin dans ce cas, comment tu passes une image dans ton PrintWriter ?


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 01-04-2005 à 12:32:58    

ce que je comprends pas, ca devrait recuperer le tag <img ...> non ? pas le binaire ...

Reply

Marsh Posté le 01-04-2005 à 12:34:41    

Bin en tombant sur un tag <img> le browser client va faire la requête sur l'image et le serveur HTTP devra lui renvoyer. Je pense que c'est à ce moment que ça chie, pas pour la récup du code HTML.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 01-04-2005 à 20:34:40    

Merci pour toutes vos réponses!
 
J'imaginais bien que l'erreur devait venir d'un cast foireux quelque part...  
 
Et quel serait le type de données le plus intéressant à utiliser à la place des Reader et des writers alors? Un type qui fonctionne avec les bytes...
 

Reply

Marsh Posté le 01-04-2005 à 21:44:47    

Bin DataOutputStream, par exemple [:spamafote]

Reply

Marsh Posté le 01-04-2005 à 21:44:47   

Reply

Marsh Posté le 01-04-2005 à 22:52:41    

Taiche a écrit :

Bin DataOutputStream, par exemple [:spamafote]


outputstream tout court pour du binaire [:spamafote]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 02-04-2005 à 16:49:59    

Ho mais ouip! Mais ca marche!
 
Il suffit de remplacer par des DataInputStream et des DataOutpuStream...on change readLine en readByte et c'est nickel!
 
Merci beaucoup à tous pour votre aide!
 
Clabecq

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed