Posez votre question Signaler

Proxy en java

karine - Dernière réponse le 12 avril 2011 à 15:42
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
Lire la suite 

Proxy en java »

19 réponses
Réponse
+2
moins plus
"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.
Ajouter un commentaire
Réponse
+1
moins plus
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!! ;-)
karinekarine - 20 avril 2005 à 15:41
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 ?
bob - 15 mai 2005 à 19:39
pourquoi ne pas utiliser URL et HttpUrlConnection ? c'est plus simple et ça gère le http ditectement...
SuperThib - 12 avril 2011 à 15:42
Bonjour, je suis entrain de réaliser le même type d'application.
Je suis coincé au même endroit. J'envoie une requete bien formée au serveur web avec le bon host sur le port 80 mais je ne sais pas trop comment récupérer la réponse du serveur pour la forwarder au client.

peux-tu me donner quelques précisions stp
Ajouter un commentaire
Réponse
+1
moins plus
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/
Ajouter un commentaire
Réponse
+0
moins plus
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.
Ajouter un commentaire
Réponse
+0
moins plus
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 ?
Ajouter un commentaire
Réponse
+0
moins plus
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 ?
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
-3
moins plus
svp je veux avoir un exemple d'un demande ecrivez en allemand a une société
Ajouter un commentaire
Réponse
-4
moins plus
stp,je veux savoir comment récupérer le proxy host et le proxy port de mon PC.
Ajouter un commentaire
Ce document intitulé « proxy en java » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook