Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Optimisation proxy java

5 réponses
Avatar
zebulon
Salut,

J'ai développé un freeware en java . C'est un proxy http que l'on peut
downloader sur http://www.httpcatcher.com

Il marche pas mal.

Je me demande cependant si il n'existe pas une méthode plus simple et
efficace pour faire ce que je veux :

J'ouvre une socket sur le serveur web, je lui envoie la requête du
navigateur.. et ensuite je dois donc recevoir la réponse..

Je lie donc les octects sur la socket en retour.. ma question est : comment
savoir que le flux d'octets est terminé ? (il n'y a pas de caractère de
fin..)



Je me base sur le Content-Length que l'on peut lire dans le header de la
réponse (je boucle tant que le nombre d'octets reçu est inférieur au CL)

Est-ce la bonne méthode ??

.. mais parfois il n'y a pas de Content-Length, alors je boucle un certain
nombre de fois..

voici le bout de code que je cherche à optimiser / simplifier .. des
suggestions ?

merci par avance



// bos est le ByteArrayOutputStream que je dois renseigner avec la réponse
du serveur, in2 est le BufferedInputStream sur la socket vers le serveur web

bos = new ByteArrayOutputStream();

// on attend la réponse du serveur

while (in2.available()==0) {

Thread.sleep(10);

}



buffer = new byte[first_buffer_size];

suite=in2.read(buffer);

bos.write(buffer);



// header_delimit : Delimitateur de la fin de l'header

int
taille_header=bos.toString().indexOf(header_delimit);

int contentlength=-1;

i=bos.toString().indexOf("Content-Length");

if (i>0) {


j=bos.toString().substring(i,bos.toString().length()).indexOf("\n");

String CL=bos.toString().substring(i,i+j);


contentlength=Integer.parseInt(CL.substring(CL.indexOf(":")+1,CL.length()).t
rim());

// System.out.println("CL="+contentlength);

}

else {

if (verbose)

System.out.println(" pas de CL !!");

}

int dejalu=suite;

if (contentlength>0) {

//on a deja lu dejalu ..

// total à lire = taille du header + contentlength =
200 + contentlength

// reste à lire 200 + contentlength - dejalu

int alire=0;

while (alire<taille_header + contentlength - dejalu)
{

buffer_size=in2.available();

alire+=buffer_size;

buffer = new byte[buffer_size];

suite=in2.read(buffer);

//System.out.println("3-bytes read :"+suite);

bos.write(buffer);

}

}

else {

// on ne connait pas la taille a priori

//on attend jusqu'à ce qu'il y ait de la reponse

fin=false;

int zero=0;

while (zero<50) {

buffer_size=in2.available();

if (buffer_size==0)

{ zero++;

Thread.sleep(10);

}

else {

buffer = new byte[buffer_size];

suite=in2.read(buffer);

bos.write(buffer);

}

}



}

5 réponses

Avatar
Farid
Salut,

J'ai développé un freeware en java . C'est un proxy http que l'on peut
downloader sur http://www.httpcatcher.com

Il marche pas mal.

Je me demande cependant si il n'existe pas une méthode plus simple et
efficace pour faire ce que je veux :

J'ouvre une socket sur le serveur web, je lui envoie la requête du
navigateur.. et ensuite je dois donc recevoir la réponse..

Je lie donc les octects sur la socket en retour.. ma question est :
comment

savoir que le flux d'octets est terminé ? (il n'y a pas de caractère de
fin..)



Je me base sur le Content-Length que l'on peut lire dans le header de la
réponse (je boucle tant que le nombre d'octets reçu est inférieur au CL)

Est-ce la bonne méthode ??

.. mais parfois il n'y a pas de Content-Length, alors je boucle un certain
nombre de fois..
.....


Tu trouvera surement ton bonheur la dedans:

http://www.innovation.ch/java/HTTPClient/


Farid

Avatar
Christophe M
Farid wrote:
Salut,

J'ai développé un freeware en java . C'est un proxy http que l'on peut
downloader sur http://www.httpcatcher.com

Il marche pas mal.

Je me demande cependant si il n'existe pas une méthode plus simple et
efficace pour faire ce que je veux :

J'ouvre une socket sur le serveur web, je lui envoie la requête du
navigateur.. et ensuite je dois donc recevoir la réponse..

Je lie donc les octects sur la socket en retour.. ma question est :


comment

savoir que le flux d'octets est terminé ? (il n'y a pas de caractère de
fin..)



Je me base sur le Content-Length que l'on peut lire dans le header de la
réponse (je boucle tant que le nombre d'octets reçu est inférieur au CL)

Est-ce la bonne méthode ??

.. mais parfois il n'y a pas de Content-Length, alors je boucle un certain
nombre de fois..
.....



Tu trouvera surement ton bonheur la dedans:

http://www.innovation.ch/java/HTTPClient/


Farid




Tiens, moi j'aurais conseillé http://jakarta.apache.org/commons/httpclient/

plus célèbre et qui a l'air plus à jour (les pages webs dataient de 2001
quand même sur l'autre site)


Avatar
zebulon
Merci, HttpClient est très bien mais ne répond pas vraiment à ma question.
En effet, celui ci fournit un InputStream et il faut gérer le flux d'octets
arrivant..


"Christophe M" <mccricri_at_hotmail.com> wrote in message
news:412d6b6a$
Farid wrote:
Salut,

J'ai développé un freeware en java . C'est un proxy http que l'on peut
downloader sur http://www.httpcatcher.com

Il marche pas mal.

Je me demande cependant si il n'existe pas une méthode plus simple et
efficace pour faire ce que je veux :

J'ouvre une socket sur le serveur web, je lui envoie la requête du
navigateur.. et ensuite je dois donc recevoir la réponse..

Je lie donc les octects sur la socket en retour.. ma question est :


comment

savoir que le flux d'octets est terminé ? (il n'y a pas de caractère de
fin..)



Je me base sur le Content-Length que l'on peut lire dans le header de la
réponse (je boucle tant que le nombre d'octets reçu est inférieur au CL)

Est-ce la bonne méthode ??

.. mais parfois il n'y a pas de Content-Length, alors je boucle un
certain



nombre de fois..
.....



Tu trouvera surement ton bonheur la dedans:

http://www.innovation.ch/java/HTTPClient/


Farid




Tiens, moi j'aurais conseillé
http://jakarta.apache.org/commons/httpclient/


plus célèbre et qui a l'air plus à jour (les pages webs dataient de 2001
quand même sur l'autre site)




Avatar
Bruno Grieder
Salut Zebulon,

A ma connaissance il n'y a pas de méthode miracle:
-le content-length
-le serveur ferme la socket quand il a fini (et ton client est notifié)
-et le bon vieux time-out qu'il est toujours bon d'implémenter (join)

Si tu connais le content-type, tu peux faire dans le sophistiqué: balise
</html>, dernière balise fermant xml etc,...



zebulon wrote:
Merci, HttpClient est très bien mais ne répond pas vraiment à ma question.
En effet, celui ci fournit un InputStream et il faut gérer le flux d'octets
arrivant..


"Christophe M" <mccricri_at_hotmail.com> wrote in message
news:412d6b6a$

Farid wrote:

Salut,

J'ai développé un freeware en java . C'est un proxy http que l'on peut
downloader sur http://www.httpcatcher.com

Il marche pas mal.

Je me demande cependant si il n'existe pas une méthode plus simple et
efficace pour faire ce que je veux :

J'ouvre une socket sur le serveur web, je lui envoie la requête du
navigateur.. et ensuite je dois donc recevoir la réponse..

Je lie donc les octects sur la socket en retour.. ma question est :


comment


savoir que le flux d'octets est terminé ? (il n'y a pas de caractère de
fin..)



Je me base sur le Content-Length que l'on peut lire dans le header de la
réponse (je boucle tant que le nombre d'octets reçu est inférieur au CL)

Est-ce la bonne méthode ??

.. mais parfois il n'y a pas de Content-Length, alors je boucle un




certain

nombre de fois..
.....



Tu trouvera surement ton bonheur la dedans:

http://www.innovation.ch/java/HTTPClient/


Farid




Tiens, moi j'aurais conseillé


http://jakarta.apache.org/commons/httpclient/

plus célèbre et qui a l'air plus à jour (les pages webs dataient de 2001
quand même sur l'autre site)









Avatar
Vincent Cantin
Il y a moyen de connaitre la fin d'un InputStream, regarde dans la
documentation de Java a la class InputStream.
Si tu lis un octet et que la valeur retournee est -1, alors c'est que le
stream est fini, et tu dois le fermer avec inputStream.close(); et ensuite
fermer ta socket avec (si tu as ouvert un outputstream il faut le fermer
d'abord : outputStream.close();) socket.close();

Vincent