Rechercher : dans
Par :

Proxy en java

Dernière réponse le 29 avr 2008 à 16:40:16 karine, le 20 avr 2005 à 09:45:14 
 Signaler ce message aux modérateurs

Bonjour à tous !

Ca fait 4 jours que je me bats avec mon proxy et là je craque!!

Ce que je voudrais, c'est récupérer les traces du client et du serveur web.
Je crée ma connexion avec le client, tout va bien.
Le problème c'est qu'après je ne sais pas comment faire la connexion entre mon proxy et le serveur web demandé par le client.

Je fais :
Socket socket = new Socket(InetAddress.getByName(host),port);

Mais qu'est-ce que je mets comme host et comme port ?
Le host c'est l'url demandé ? C'est localhost ?
Le port, c'est le même que celui de la connexion client ? C'est un autre ?
J'ai l'impression d'avoir essayé toutes les combinaisons de port possibles et rien ne marche.

Si quelqu'un peut m'aider, je l'en remercie d'avance.
Je file le code si ça peut vous éclairer

public class PServer {
    final static int localport = 8080;
    
    
    public static void main(String[] args) throws IOException {
        
        ServerSocket serveur = null;
        try{
            serveur = new ServerSocket(localport);
            System.out.println("Serveur proxy démarré sur le port " + localport);
            // Ecoute infinie des requêtes des clients
            while(true){
                Socket client = serveur.accept();
                Clients c = new Clients(client);
            }
        }
        catch (Exception e){System.err.println(e);}
        finally{
            try{
                if (serveur != null) serveur.close();
            }
            catch (Exception e){System.err.println(e);}
        }
    }
    
} // ! PServ class

class Clients extends Thread {
    private Socket client;
    private String url;
    private URL Url;
    private InputStream sin;
    private OutputStream sout;
    
    public Clients(Socket client){
        try{
            this.client = client;
            start();
        }
        catch (Exception e){System.err.println(e);}
    } // !constructeur
    
    public void run(){
        try{
            sin = client.getInputStream();
            BufferedReader from_client = new BufferedReader(new InputStreamReader(sin));
            sout = client.getOutputStream();
            byte [] buffer = new byte[4096];
            int lus;
            
            String tmp;
	    String requete = "";
            int position;
            boolean fini = false;
            int cpt = 0;
	    
            // Lecture de l'url que le client demande
            while (((tmp = from_client.readLine()) != null) && !fini){
	    	System.out.println(tmp);
		//System.out.println((tmp != null) && !fini);
		
		//System.out.println("ICI" + tmp.trim().toUpperCase());
                if (tmp.trim().toUpperCase().startsWith("GET")) {
                    position = tmp.trim().toUpperCase().lastIndexOf("HTTP") > 0 ? tmp.toUpperCase().lastIndexOf("HTTP") : tmp.length();
                    url = tmp.trim().substring(3,position).trim();
		    requete = requete + tmp;
		    //System.out.println("URL :" + url);
                    //fini = true;
                }
		
		// il faut recuperer le User-Agent et le Host
		String regex = "^User-Agent: +(.*\\))$";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(tmp);
		
		while (m.find()){
			requete = requete + m.group(0);
			/*for (int i=0; i <= m.groupCount(); i++){
			System.out.println("Groupe " + i + " : " + m.group(i));
			}*/
		}
		
		String regex2 = "^Host: +(.*)";
		Pattern p2 = Pattern.compile(regex2);
		Matcher m2 = p2.matcher(tmp);
		
		while (m2.find()){
			requete = requete + m2.group(0);
			/*for (int i=0; i <= m2.groupCount(); i++){
			System.out.println("Groupe " + i + " : " + m2.group(i));
			}*/
		}
		
		cpt++;
		//System.out.println(cpt);
		if (cpt >= 5) {
			fini = true;
			//System.out.println("fini" + fini);
			//System.out.println("URL ?" + url);
			}
		//System.out.println("URL ? " + url);
		//System.out.println("la requete envoyée au serveur : " + requete);
            }
            
            // création d'une connexion sur le serveur http cible
            System.out.println("Url demandée : " + url);
	    
	    //appel à la classe proxyClient
	    proxyClient p = new proxyClient(client, requete, url);
	    
	    
            /*URL Url = new URL(url);
            InputStream httpin = Url.openStream();
            
            while( (lus = httpin.read(buffer)) != -1) sout.write(buffer,0,lus);
            httpin.close();
            client.close();*/
        }
        catch (Exception e){System.err.println(e);}
    } // ! run() method
} // ! Clients class


class proxyClient extends Thread {

private Socket client;
private String requete;
private String url;
public static int port = 8080;
public static String  host = "localhost";



	public proxyClient(Socket client, String requete, String url){
        	try{
            		this.client = client;
			this.requete = requete;
			this.url = url;
            		start();
        	}
        	catch (Exception e){System.err.println(e);}
    	} // !constructeur
	
	public void run(){
	String tmp = "";
	int position;
	int count=-1;
	 
        try { 
		/*URL Url = new URL(url);
            	InputStream httpin = Url.openStream();
            
            	while( (lus = httpin.read(buffer)) != -1) sout.write(buffer,0,lus);
            	httpin.close();*/
		Socket socket = new Socket(InetAddress.getByName(host),port);
		System.out.println("socket créé");
		
		
		
		socket.close();
		client.close();
		
	}
        catch (Exception e){System.err.println(e);}
	
    } // ! run() method

} // ! proxyClient class

Meilleures réponses pour « proxy en java » dans :
Installer un serveur proxy HTTP (Squid) VoirSommaire : 1. Installer le proxy 2. Configurer le proxy 2.1 Nommer le proxy 2.2 Choisir le port 2.3 Choisir l'interface 2.4 Définir les droits d'accès 2.5 Autoriser le groupe 2.6 Autoriser les ports non standards 3. Démarrer le...
Installer Java sous Ubuntu VoirPar défaut, Firefox n'est pas fourni avec Java. Voici comment procéder pour l'installer: Ouvrez un terminal (Menu Applications > Accessoires > Terminal) et tapez: sudo aptitude install sun-java6-jre sun-java6-plugin ou sudo aptitude install ...
[Firefox] plugin Java Jre de Sun VoirA) Les différentes variantes Java chez Sun B) Installation sous Mandriva Limited Edition 2005 ETAPE 1 ETAPE 2: Création du lien symbolique C) Installation sous debian lenny D) Installation sous ubuntu hardy heron A) Les différentes...
Télécharger Java Runtime Environment VoirJava Runtime Environment (JRE) installe la machine virtuelle Java, permettant de jouer en ligne, de discuter avec des personnes dans le monde entier, de calculer les intérêts de votre prêt immobilier ou de visualiser des images en 3D. Ces...
Serveurs proxy (serveurs mandataires) et reverse proxy VoirProxy Un serveur proxy (traduction française de «proxy server», appelé aussi «serveur mandataire») est à l'origine une machine faisant fonction d'intermédiaire entre les ordinateurs d'un réseau local (utilisant parfois des protocoles autres que le...
Java - Premier programme VoirPremière application avec Java La première chose à faire est de créer un simple fichier texte (sans mise en forme) et de taper les quelques lignes suivantes : // Votre premiere application en Java class FirstApp { public static void main...
Java - Les types de données VoirLes primitives Java est un langage orienté objet, c'est-à-dire que les éléments manipulés sont des classes, ou plus exactement des objets, c'est-à-dire des instances de classes. Toutefois ces objets contiennent des données possèdant un type (et...

1

sebsauvage, le 20 avr 2005 à 09:56:15

Le Host, c'est ce que demande le client dans l'entête HTTP:

Exemple:

  GET /articles/index.shtml HTTP/1.0
  User-Agent: Mozilla 4.0 (X; I; Linux-2.0.35i586)
  Host: www.perlfect.com
  Accept: image/gif, image/jpeg, */*



Tu dois donc te connecter sur www.perlfect.com sur le port 80 (puisqu'aucun port n'est précisé), et envoyer la requête tel quel au serveur.

Répondre à sebsauvage

2

karine, le 20 avr 2005 à 10:02:00

C'est ce que j'avais fait pour tester.
J'ai mis www.kochonland.com comme host et 80 comme port.

J'obtiens une erreur java.net.ConnectException: Connection refused

Qu'est-ce que je peux faire ?

Répondre à karine

3

karine, le 20 avr 2005 à 10:17:43

En fait ça a l'air de marcher à peu près maintenant.

Mais comment je fais pour lire ce que renvoie le serveur et le renvoyer au client ?

Répondre à karine

4

karine, le 20 avr 2005 à 10:32:50

Pour lire la socket, je fais ça :

Socket socket = new Socket(InetAddress.getByName(url),port);
		System.out.println("socket créé");
		
		sin = socket.getInputStream();
		
            	BufferedReader from_Web = new BufferedReader(new InputStreamReader(sin));
		
            	sout = socket.getOutputStream();
		
            	byte [] buffer = new byte[4096];
            	int lus;
            
            	
	    	
            	boolean fini = false;
	    
            	// Lecture de la réponse
            	while (((tmp = from_Web.readLine()) != null) && !fini){
	    	System.out.println("tmp" + tmp);
		}
		
		socket.close();
		client.close();


Mais le from_Web.readLine est vide !
Et la page web ne s'affiche pas...

Est-ce que quelqu'un voit le problème dans mon code ?
Merci

Répondre à karine

5

karine, le 20 avr 2005 à 11:02:34

Je viens de remarquer que le from_Web.readLine() est "bloqué".

while (((tmp = from_Web.readLine()) != null) && !fini){
	    	System.out.println("tmp" + tmp);
		fini = true;
		}
System.out.println("sortie");


Le programme ne rentre pas dans la boucle (pas d'affichege de tmp) mais il n'en sort pas non plus (pas d'affichege de sortie).

Comment je peux faire ?
Aidez-moi s'il vous plait, je deviens folle!! ;-)

Répondre à karine

6

Satrialien, le 20 avr 2005 à 12:05:32

Salut Karine,

à ce que je vois le proxy est en train de te finir :)

La boucle que tu as montré, est-ce que tu l'as essayé toute seule, dans un petit main juste pour tester qu'en faisant une connexion sur un serveur web sur son port 80 et en lui passant une requête http ça fonctionne ?
Si tu restes bloquée sur la condition de ton while, c'est que le serveur web ne te répond pas. Plusieurs explications :
- il te répond pas car la connexion établie avec lui ne fonctionne pas donc tu ne reçoit pas sa réponse.
- il te répond pas car il a pas reçu d'abord ta requête

Le plus simple, si tu es sure que ce que tu as fais devrait fonctionner, c'est de monter toi même son propre serveur web pour faire ces tests : comme ça tu verras les requetes qui lui parviennent (si elles lui arrivent) et les réponses qu'il renvoie, ça te permettra d'en savoir un peu plus long.

Répondre à Satrialien

7

karine, le 20 avr 2005 à 13:31:14

Justement,

Quand j'écris
Socket socket = new Socket(InetAddress.getByName(url),port);

l'url c'est celle que demande le client.
Mais je me rend compte que je ne passe pas la requete au serveur Web.
Il faut donc que j'écrive sur la socket.
Comment je fais ça ?

Répondre à karine

8

karine, le 20 avr 2005 à 13:39:07

Ah, ça n'avance!! ;-)

Je retrouve le (un peu) sourire.

Donc j'ai une réponse du serveur !
Mais il me dit HTTP/1.1 400 Bad Request

Comme requete je lui ai envoyé le GET, l'url, la version HTML, le Host et le User-agent (le tout concaténé dans une chaîne).

Sous quel format j'aurai plus de chance de plaire au serveur ?

Répondre à karine

9

karine, le 20 avr 2005 à 14:02:50

Alors, voila ce que j'envoie comme requete

if (host_client != "") {
			sortant.println(requete + "\n" + user_agent + "\n" + host_client + "\n" + "\n");
			System.out.println(requete + "\n" + user_agent + "\n" + host_client + "\n" + "\n");
		} else {
			sortant.println(requete + "\n" + user_agent + "\n" + "\n");
			System.out.println(requete + "\n" + user_agent + "\n" + "\n");
		}


Dans le terminal j'obtiens ça :
la requete envoyée ->
GET http://www.kochonland.com/ HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; Konqueror/3.2; Linux) KHTML/3.2.3 (like Gecko)


la réponse -> HTTP/1.1 400 Bad Request

Pourquoi le serveur ne veut toujours pas de ma requete ?

Répondre à karine

10

karine, le 20 avr 2005 à 14:16:29

Je me dit que ça vient peut-être de la fin de la requête.
Je voudrais mettre l'équivalent d'un <CR-LF>.
J'ai essayé avec /c/l mais ça compile pas.

Est-ce que quelqu'un sait comment faire ça ?
J'arrive pas à trouver sur le net.

Répondre à karine

11

Satrialien, le 20 avr 2005 à 14:20:56

Je viens de retrouver un bout de code que j'avais fait :

Socket sock = new Socket(addr,187);
         
         BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF8")); 
         
         wr.write("GET /stores/intranet/preLogin.jhtml HTTP/1.0 \r\n");
         wr.write("identifiant: abcd1234\r\n");
         wr.write("\r\n");
         wr.flush();

Ca me permettait de lancer une requête HTTP à un serveur web via une socket. Essaie de t'en inspirer et dis moi si ça fonctionne

Répondre à Satrialien

12

karine, le 20 avr 2005 à 14:30:05

Non, ça marche pas.

J'ai mis des \r\n à la place des \n

La requête a pourtant une bonne tête :
GET http://www.iad-pro.infop6.jussieu.fr/ HTTP/1.1
User-Agent: Mozilla/5.0 (compatible; Konqueror/3.2; Linux) KHTML/3.2.3 (like Gecko)

HTTP/1.1 400 Bad Request

Y a même la ligne vide après.

Si quelqu'un a une idée ...

Répondre à karine

13

karine, le 20 avr 2005 à 15:41:20
  • +1

Mon proxy a avancé, maintenant j'arrive à ma connecter correctement au serveur Web.

Mais le problème c'est que quand je fais
Socket socket = new Socket(InetAddress.getByName(url),port);

J'utilise l'url demandé par le client comme host.
Mais après quand l'url est par exemple www.kochonland.com/bloque_f5.j , j'obtiens une erreur java.net.UnknownHostException: www.kochonland.com/bloque_f5.j

Comment faire pour avoir un host correct à chaque fois ?

Répondre à karine

15

bob, le 15 mai 2005 à 19:39:33

Pourquoi ne pas utiliser URL et HttpUrlConnection ? c'est plus simple et ça gère le http ditectement...

Répondre à bob

14

sebsauvage, le 20 avr 2005 à 15:46:24

Mais après quand l'url est par exemple www.kochonland.com/bloque_f5.j , j'obtiens une erreur java.net.UnknownHostException: www.kochonland.com/bloque_f5.j

Il faut se connecter uniquement sur le host (www.kochonland.com)
Et après, seulement, envoyer la requête HTTP.


Voir:
http://www.sebsauvage.net/comprendre/url/

Répondre à sebsauvage

16

abdo, le 1 mar 2008 à 13:01:35

Stp,je veux savoir comment récupérer le proxy host et le proxy port de mon PC.

Répondre à abdo

17

 Phoxtrot, le 29 avr 2008 à 16:40:16

"stp,je veux savoir comment récupérer le proxy host et le proxy port de mon PC."

Mauvaise question.

Ton PC n'as pas de proxy host et de proxy port.

Tes connexions peuvent éventuellement en avoir. Mais ca dépend de la configuration des programmes que tu utilises aller sur le(s) réseau(x), chaque programme ayant sa propre configuration et donc potentiellement un (ou plusieurs) proxy host différent(s).

Ton PC possède probablement une seule adresse IP par contre (bien qu'il soit possible d'en avoir plusieurs à la fois) mais elle change probablement à chaque fois que tu relance ton modem (ou équivalent). Il possède vraisemblablement quelques dizaines de millliers de ports utilisables (enfin si aucun firewall ne s'en mêle).

Bref, mauvaise question.

Répondre à Phoxtrot
Collection CommentÇaMarche.net