IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

DataInputStream, fonction read(), délai trop élévé quand =-1


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut DataInputStream, fonction read(), délai trop élévé quand =-1
    Bonjour à tous,

    je suis en train de développer un client HTTP en Java (parce que la classe HttpURLConnection ne me plaît pas).

    J'envoie donc une requête à un serveur apache (get ou post) qui me renvoie une réponse avec la ressource demandée (un fichier html par exemple).

    Je récupère ce fichier grâce à une fonction "saveIntoFile()" qui utilise la fonction read de la classe DataIntputStream. Voici ma boucle while qui lit mon flux entrant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    byte[] buff = new byte[bufferSize];			
    			int readBytesNb;
    			byte[] readBytes;
    			
    			while ((readBytesNb = reader.read(buff, 0, bufferSize)) != -1) {
    				if (readBytesNb == bufferSize) {					
    					writer.write(buff);					
    				} else {
    					readBytes = new byte[readBytesNb];
    					System.arraycopy(buff, 0, readBytes, 0, readBytesNb);
    					writer.write(readBytes);
    				}
    			}
    Tant que la fonction read retourne autre chose que -1, tout fonctionne correctement. Dès lors qu'elle retourne -1 (c'est-à-dire qu'il n'y a plus rien à lire), il se passe bien 3 secondes avant de sortir de la boucle !

    Je ne comprends absolument pas d'où peut provenir ce délai beaucoup trop long à mon goût, constant quelque soit la taille du fichier.

    Quelqu'un aurait-il une idée ?

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    C'est le timeout de lecture pour la socket. Ce timeout peut être spécifié lors de la construction de la socket.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut
    Merci pour votre réponse, mais cela ne règle pas le problème. Si je spécifie un timeout de 1000 ms par exemple, le processus attend 1 seconde et lance une SocketTimeoutException (sans sortir de la boucle).

    Le plus étrange dans l'histoire, c'est que j'avais déjà commencé à faire un HttpClient en utilisant la classe URLConnection de java. J'avais une fonction exactement identique (puisque je l'avais copiée/collée) pour sauvegarder le flux dans une fichier et il n'y avait aucun délai d'éxecution .

  4. #4
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut
    Existe-t-il une différence entre le inputStream issu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    urlConnection.getInputStream()
    et celui issu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket.getInputStream()
    ? Cela serait peut-être la clé de mon problème.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par DaveRidic Voir le message
    Existe-t-il une différence entre le inputStream issu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    urlConnection.getInputStream()
    et celui issu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socket.getInputStream()
    ? Cela serait peut-être la clé de mon problème.
    Oui : URLConnection gère le protocole HTTP, ce que ne fait pas la socket "seule"...

    Donc si tu veux le faire par toi-même, il faut implémenter le protocole HTTP et toutes ses subtilités...

    a++

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut
    Et savez-vous quelle subtilité du protocole HTTP fait que la lecture d'un inputStream vide met 5 secondes à retourner -1 ?

  7. #7
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Juste en passant, ton code n'est pas des plus optimisé. Tu devrais plutôt faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    byte[] buff = new byte[bufferSize];			
    int readBytesNb;
     
    while( ( readBytesNb = reader.read( buff ) ) > 0 )
    {
      writer.write( buff, 0, readBytesNb );
    }
    Plus simple, non ?

    Sinon, ajoute une trace à l'intérieur de ta boucle pour être sûr que tu ne boucles pas un grand nombre de fois avant de sortir.
    Ayant déjà codé un mini client HTTP, je n'ai jamais eu ce genre de problème...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  8. #8
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut
    Merci pour le code ! C'est effectivement plus simple

    ça ne résout pas mon problème, mais bon...

    J'ai déjà utilisé des traceurs, de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    byte[] buff = new byte[bufferSize];
    int readBytesNb;
    			 
    while( (readBytesNb = reader.read(buff)) > 0 ){
    	System.out.println(readBytesNb);				
    	writer.write( buff, 0, readBytesNb );
    	System.out.println(readBytesNb);
    }
    System.out.println(readBytesNb);
    Le script affiche quasi instantanément :

    Puis, 5 secondes plus tard :

    93, c'est la taille de mon fichier en octets (mais vous vous en serez douté )

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonction read ?
    Par K20 dans le forum C
    Réponses: 4
    Dernier message: 26/09/2006, 23h56
  2. fonction read et assimilé
    Par fveysseire dans le forum C
    Réponses: 9
    Dernier message: 12/07/2006, 08h20
  3. Réponses: 4
    Dernier message: 23/03/2006, 15h29
  4. Problème avec la fonction read.
    Par Whaouu dans le forum Langage
    Réponses: 10
    Dernier message: 23/09/2005, 10h33
  5. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo