Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1938 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Java.io]Buffered Reader sur socket + ReadLine()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Java.io]Buffered Reader sur socket + ReadLine()

n°1089285
gendhal
Posté le 19-05-2005 à 15:32:18  profilanswer
 

Bonjour,  
tout d'abord le contexte:mon programme est un serveur http.  
Je cherche à recuperer l'ensemble d'une requete Http sous forme de String.  

Citation :


private Socket _socket;  
 
private String _rep;  
private int _port;  
private PrintStream _os;  
private BufferedReader _is;  
private Requete _requete;  
private MyHttpServlet _httpServlet;  
 
public Httpd(int port, String rep, Socket socket) throws Exception {  
 
_socket = socket;  
_port = port;  
_os = new PrintStream(_socket.getOutputStream());  
_is = new BufferedReader(new InputStreamReader(_socket.getInputStream()));  
String temp=null;  
String r=null;  
while((temp=_is.readLine())!=null)  
{  
System.out.println("temp="+temp);  
r=r+temp;  
}  
 
_requete=new Requete(r);  
}  


Mon probleme:  
Mon serveur reste coincé dans la boucle.  
Pourtant les specifications de la methode readLine() indiquent bien que celle_ci renvoie null lorsque le tampon est vide.  
Il semble que les headers et le corps de la requête Http soient separés par une ligne vide ce qui pourrait être a l'origine de mon probleme. J'aurais aime pouvoir faire un read pour mettre le tout dans un tableau de byte pour voir mais je ne trouve pas de methodes adequates.  
 
Merci pour votre aide.

mood
Publicité
Posté le 19-05-2005 à 15:32:18  profilanswer
 

n°1089335
tequilla76
Posté le 19-05-2005 à 15:49:46  profilanswer
 

il faut pas un PrintWriter au lieu d'un PrintStream (enfin j'ai jamais utilisé PrintStream, c'est peut etre bien)?

n°1089418
benou
Posté le 19-05-2005 à 16:11:39  profilanswer
 

pour peux que ton client http laisse ouverte la connexion, y a rien d'étonnant à ce que tu sortes pas de la boucle ... un navigateur le fait par exemple : il utilise la même connection pour envoyer plusieurs requêtes séquantiellement, c'est une optimisation.
 
C'est où qu'elle s'arrête ta boucle ? que'est ce que tu as reçu quand elle s'arrête ?


---------------
ma vie, mon oeuvre - HomePlayer
n°1089471
nraynaud
lol
Posté le 19-05-2005 à 16:28:38  profilanswer
 

+1 sur benou. En plus les navigateurs font ça proprement avec un flush et tout.
 
d'autre part, je me demande si tu ne ferais pas mieux de réutiliser une bibliothèque de haut niveau pour le http, on est plus à l'âge de pierre.


---------------
trainoo.com, c'est fini
n°1089482
benou
Posté le 19-05-2005 à 16:31:44  profilanswer
 

nraynaud a écrit :

d'autre part, je me demande si tu ne ferais pas mieux de réutiliser une bibliothèque de haut niveau pour le http, on est plus à l'âge de pierre.


+1 mais t'en connais pour la partie serveur du HTTP ? (ou bien carrément des trucs du style jetty, tomcat etc ...)
 
mais c'est peut être plus éducatif que productif le travail qu'il a à faire ...


Message édité par benou le 19-05-2005 à 16:32:00

---------------
ma vie, mon oeuvre - HomePlayer
n°1089495
nraynaud
lol
Posté le 19-05-2005 à 16:34:31  profilanswer
 

benou > pour le décodage, c'est le même protocole que côté client.


---------------
trainoo.com, c'est fini
n°1089499
benou
Posté le 19-05-2005 à 16:35:38  profilanswer
 

nraynaud a écrit :

benou > pour le décodage, c'est le même protocole que côté client.


qu'est ce que tu apelles décodage ? lecture des l'entête ? tu connais une API qui a bien packagé ça ?


---------------
ma vie, mon oeuvre - HomePlayer
n°1089506
nraynaud
lol
Posté le 19-05-2005 à 16:39:09  profilanswer
 

Apache a un truc, mais j'ai pas été voir.


---------------
trainoo.com, c'est fini
n°1089509
benou
Posté le 19-05-2005 à 16:39:57  profilanswer
 

nraynaud a écrit :

Apache a un truc, mais j'ai pas été voir.


HTTPClient ?
je l'ai utilisé ... j'ai pas creusé l'intérieur de l'API mais bon, c'est pas fait pour non plus ...


---------------
ma vie, mon oeuvre - HomePlayer
n°1089581
gendhal
Posté le 19-05-2005 à 16:48:32  profilanswer
 

Citation :


il faut pas un PrintWriter au lieu d'un PrintStream  


C'est kiff kiff mon probleme ne vient pas de la.

Citation :


il utilise la même connection pour envoyer plusieurs requêtes séquantiellement, c'est une optimisation.


Tu as surement raison benou. Mon problème est que je veux récupérer les parametres d'un requête Post, parametres qui se trouveraient dans le corps du message. Et je ne vois psa comemnt recuperer le corps du message.

Citation :


C'est où qu'elle s'arrête ta boucle ? que'est ce que tu as reçu quand elle s'arrête ?


Elle s'arrete à la fin des headers soit pour un requête de type Post à "content-length:" qui mindique justement la taille du corps du message. Apres cela d'apres mes sources îl y aurait une ligne vide puis le corps. Je pourrais m'arreter à "content-length:" mais comment recuperer la suite ?

Citation :


d'autre part, je me demande si tu ne ferais pas mieux de réutiliser une bibliothèque de haut niveau pour le http, on est plus à l'âge de pierre.


Oui bien sur mais c'est un petit projet d'etude pour nous faire apréhender les subtilités d'un serveur de servlet tout simplement.

mood
Publicité
Posté le 19-05-2005 à 16:48:32  profilanswer
 

n°1089592
benou
Posté le 19-05-2005 à 16:51:14  profilanswer
 

ca vient du fait que y a pas de \r\n à la fin du corp de la requête HTTP => si la connextion est pas fermée, tu restes en attente d'un retour à la ligne dans ta boucle...
 
=> tu dois arrêter de faire ca à coup de readline et le faire proprement : lire ce qu'il y a dans le content-length et lire exactement le nombre d'octets indiqués


---------------
ma vie, mon oeuvre - HomePlayer
n°1089620
gendhal
Posté le 19-05-2005 à 17:00:45  profilanswer
 

Ouai ba voila c bien la piste que l'on m'avait donne mais je doit être un peu teube j'ai pas trouvé comment faire ca, je pige pas trop le fonctionnement de toutes ces methodes read(), jaurais aime recupérer un tableau de bytes mais je vois pas comment.

n°1089628
benou
Posté le 19-05-2005 à 17:03:25  profilanswer
 

regarde la javadoc ... c'est très compréhensible ...


---------------
ma vie, mon oeuvre - HomePlayer
n°1089722
gendhal
Posté le 19-05-2005 à 18:13:19  profilanswer
 

Bon voila j'ai mis en tampon un tableau de bytes au lieu d'un BufferedReader en utilisant la methode read() mais le resultat est le meme et je comprend pas ce que je dois faire la ... Je comprend pas pourquoi ca marche pas avec un tableau d'octets.

n°1089771
benou
Posté le 19-05-2005 à 18:42:11  profilanswer
 

Citation :

je comprend pas ce que je dois faire la


Ben c'est là le problème ...
 
Qu'est ce que tu as pas compris ???
comme je t'ai expliqué, le problème de ta boucle qui bloque c'est la condition d'arrêt de ta boucle.
 
Dans le parsing d'une requête http, cette condition est pas constante : pour lire les headers il faut les lire ligne par ligne, dans le cas d'une requête de type post, il faut trouver le header content-length, lire sa valeur.
Une fois arrivé dans le corp de la requête http (après le double \r\n), il faut lire exactement le nombre d'octets indiqué dans le content-length.
 
Une fois que tu en est arrivé là, tu dois remettre ton flux en attente d'une requête http au cas où le browser enverrai une autre requête http en utilisant cette connexion.


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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Java.io]Buffered Reader sur socket + ReadLine()

 

Sujets relatifs
recherche de fichier en javarendre executable un code source Java
[Java] La réflexion sur la session foire[Java | Batik] Demande d'aide pour aller plus loin
Le xml en java, et programme en tache de fond...[Java] Reverse engineering avec ArgoUml
[java] Enregistrer une image dans un fichier.Problème d'insertion java
Java 3D 
Plus de sujets relatifs à : [Java.io]Buffered Reader sur socket + ReadLine()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR