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

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

Marsh Posté le 19-05-2005 à 15:32:18    

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.

Reply

Marsh Posté le 19-05-2005 à 15:32:18   

Reply

Marsh Posté le 19-05-2005 à 15:49:46    

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

Reply

Marsh Posté le 19-05-2005 à 16:11:39    

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
Reply

Marsh Posté le 19-05-2005 à 16:28:38    

+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
Reply

Marsh Posté le 19-05-2005 à 16:31:44    

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
Reply

Marsh Posté le 19-05-2005 à 16:34:31    

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


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-05-2005 à 16:35:38    

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
Reply

Marsh Posté le 19-05-2005 à 16:39:09    

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


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 19-05-2005 à 16:39:57    

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
Reply

Marsh Posté le 19-05-2005 à 16:48:32    

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.

Reply

Marsh Posté le 19-05-2005 à 16:48:32   

Reply

Marsh Posté le 19-05-2005 à 16:51:14    

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
Reply

Marsh Posté le 19-05-2005 à 17:00:45    

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.

Reply

Marsh Posté le 19-05-2005 à 17:03:25    

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


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

Marsh Posté le 19-05-2005 à 18:13:19    

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.

Reply

Marsh Posté le 19-05-2005 à 18:42:11    

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
Reply

Sujets relatifs:

Leave a Replay

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