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 :

[Debutant] transfert HTTP plutot lent


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut [Debutant] transfert HTTP plutot lent
    Bonjour,

    je suis en train de developper un petit programme qui a partir d'une url contacte le serveur, demande la page et affiche le code html.

    partie importante du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    			Socket clientSocket = new Socket(host,9080);
    			DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    			BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    			outToServer.writeBytes("GET " + path + " HTTP/1.1\nHost: " + host + "\n\n");
     
     
    			while ((readLine = inFromServer.readLine()) != null) {
     
             		System.out.println(readLine);
          		}
     
    			System.out.println("End of stream");
     
    			clientSocket.close();
    cela fonctionne, mais quelque chose m'ennuie.
    Le téléchargement du fichier se fait rapidement, mais avant que le programme se termine, il y a un temps d'attente de 2 ou 3 secondes avant que inFromServer.readLine() revoie NULL.
    Y'a t'il une autre facon de faire qui supprimerait ce temps d'attente?
    Je souhaite en fait chronometrer le temp de téléchargement de la page et ces secondes supplémentaires fausseraient les mesures.

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de Wookai
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2004
    Messages
    307
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2004
    Messages : 307
    Par défaut
    Je pense que le temps d'attente provient du timeout du socket, c'est-à-dire le temps qu'il attend une réponse avant de décider que celle-ci est perdu et de fermer.

    Tu peux modifier le timeout d'un socket de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int timeout = 60000; // en milisecondes
    clientSocket.setSoTimeout(timeout);

  3. #3
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Merci de ta réponse.
    J'ai fait plusieurs essais, mais ca n'a pas l'air de venir de là.
    j'ai chronometré à la main et ca donne ca :
    - une fois que la page est chargée completement (</html> s'est affiché), il faut encore 5 secondes pour que inFromServer.readLine() renvoie null.
    - Si je met un timeout suppérieur à 5 au socket, aucun changement ( logique )
    - si je met un timeout inferieur, une exception est générée et termine l'application.

    voici le code complet si quelqu'un veut essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    import java.io.*;
    import java.net.*;
     
     
    public class check_http_transaction {
     
    	public static void main(String[] args) throws Exception{
     
    		boolean p_help=false,p_verbose=false,p_rt=false,p_url=false;
    		String url=new String(),host=new String(),path=new String(),readLine;
     
    		for (int i = 0; i < args.length; i++) { 
     
        		if (args[i].equals("--help")){
        			p_help = true;
        		}
     
        		if (args[i].equals("--rt")){
        			p_rt = true;
        		}
     
        		if (args[i].equals("--verbose")){
        			p_verbose = true;
        		}
     
        		if (args[i].length()>6 && args[i].substring(0,6).equals("--url=")){
        			url = new String(args[i].substring(6));
     
        			if(url.indexOf("/") >= 0){
        				host = url.substring(0,url.indexOf("/"));
        				path = url.substring(url.indexOf("/"));
        			}
        			else{
        				host = url.substring(0);	
        				path = "/";
        			}
     
        			System.out.println(host);
        			System.out.println(path);
        			p_url=true;
        		}	
    		}
     
    		if (p_help || !p_url){
    			System.out.println("Syntax: check_http_transaction --url=url_to_fetch");
    			System.out.println("        --verbose to obtain more output during execution");
    			System.out.println("        --help to have this information");
    			System.out.println("        --rt to obtain needed time to do full operation instead of availability status\n");
    		}
    		else
    		{
     
    			Socket clientSocket = new Socket(host,80);
    			//clientSocket.setSoTimeout(4000);
    			DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
    			BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    			outToServer.writeBytes("GET " + path + " HTTP/1.1\nHost: " + host + "\n\n");
     
     
    			while ((readLine = inFromServer.readLine()) != null) {
     
             		System.out.println(readLine);
          		}
     
    			System.out.println("End of stream");
     
    			clientSocket.close();
    		}
     
     
    	}
    }
    il faut lancer le programme avec --url=www.google.com comme parametre pour tester.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Test le temps sur ton application en ajoutant des System.currentTimeMillis().
    Il peut y avoir plusieurs raisons:
    transfer : ton http n'est pas instanantané, normal
    code :
    les System.out.println("....") consomme des ressources et le faire a chaque iteration dans une boucle ralentie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int input = 1000;
    for(int i = 0 ; i<input;i++);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for(int i = 0 ; i<input;i++){
               System.out.println(i);
    }
    ne sont pas comparables quant a leur durée.
    Le probleme pourrait aussi venir de la concatenation de String par +, il est preferable d'utiliser StringBuffer ou StringBuilder cf FAQ. Mais cela semble pas de te concerner.

  5. #5
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Merci de tes conseil. Pour ce qui est du code j'ai trés peu d'experience de l'api java désolé ^-^'

    Pour le chrono, manifestement il y a une pose de 5 secondes à la fin de la connection. Si je soustrait 5000 au temp ecoulé j'obtient le temps pris par le transfert de données. C'est du bricolage mais ca semble fonctionner. Mais cela m'ennuie tout de même. J'ai besoin d'integrer pr la suite des instructions ARM dans le code, mais là je ne pourrais pas soustraire ces 5 secondes.

    Je fais peut etre fausse route avec ma methode. Comment ferriez-vous pour mesurer le temps d'une transaction http pour une page donnée?

    merci pour votre aide!

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Par défaut
    Tu peux toujours utiliser la commande ping mais ce n'est pas du java... Mais c'est vrai que pour detecter la fin du fichier je vois pas... En fait, ce n'est qu'une hypothèse mais il n'y a rien d'explicite pour determiner la fin du fichier, il attends donc qu'il ne recoive plus rien...
    Si tu trouves une solution, postes la en gros.

  7. #7
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Merci.

    Effectivement, il ne semble pas y avoir d'autre facon de faire. J'ai essayé de detecter le </html> de fin de fichier, mais ca demande que le fichier soit correctement formaté et de plus qu'il y ai un saut de ligne en fin de fichier sinon la ligne n'est pas lue.
    J'ai fait un test avec telnet en envoyant les instructions http à la main , le code html apparait et là aussi : 5 secondes d'attente avant de fermer definitivement la connection.
    Snif...

  8. #8
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 14
    Par défaut
    C'est normal qu'une exception soit déclenchée une fois que tu as positionné le timeout avec setSoTimeout. Cette exception est justement levée quand ta socket a atteint ce timeout.
    Il suffit de trapper cette exception java.io.InterruptedIOException.

  9. #9
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    As-tu ce problème d'attente de fermeture avec n'importe quel site?

    Il se pourrait que le problème provient du serveur que tu testes.

  10. #10
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Euh... en fait avec mon prog java, je ne peux tester que sur un seul serveur qui se trouve sur le reseau de l'entreprise ( très rapide).
    Les appels exterieurs etant bloqués (je crois qu'il faut utiliser un proxy :/ )
    Idem avec telnet.

    Je ne crois pas que le probleme vienne de là. Le serveur que je contacte est à 10 mètres de moi et je suis le seul à l'utiliser ou presque.
    D'autant plus que c'est toujours les meme 5 secondes... Evidement quand j'ai essayé de detecter le </html> ca allait beaucoup plus vite, mais ca ne marche pas tout le temps

  11. #11
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Ce n'est pas parce que ton serveur est à dix mètres qu'il va te répondre correctement à une requête qui lui paraît mal formée.

    Tu utilises une requête HTTP version 1.1 "faite maison".

    Essaie donc d'effectuer le test avec une requête version 1.0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    outToServer.writeBytes("GET " + path + " HTTP/1.0\nHost: " + host + "\n\n");

  12. #12
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Par défaut
    Ah ben mince alors!!!!!

    Ca marche!

    Merci mon sauveur

    maintenant... pourquoi le http 1.1 pose problème et pas le 1.0 ?

  13. #13
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Parce que les serveurs implémentant la version du protocole 1.1 sont "sensibles" aux paramètres du header. Tu peux continuer avec la version 1.1 mais il est nécessaire de passer un header correct sinon "gare à toi"

    En plus, la version 1.1 implémente le Keep-Alive. Ce paramètre permet de laisser "ouverte" une connexion avec le serveur. Si tu veux travailler avec la version 1.1, utilise le paramètre "Connection: close" dans le header.

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

Discussions similaires

  1. [Debutant] Serveur HTTP
    Par sorry60 dans le forum C#
    Réponses: 8
    Dernier message: 10/05/2008, 18h28
  2. [Debutant] Transfert de Access vers Oracle
    Par Djekill dans le forum Oracle
    Réponses: 4
    Dernier message: 06/10/2006, 14h05
  3. [debutant] transfert d'une base vers un autre serveur
    Par Fris@u dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/03/2006, 15h15
  4. [Debutant]Transfert StringGrid ou Edit texte vers RaveReport
    Par ghan77 dans le forum Composants VCL
    Réponses: 15
    Dernier message: 13/12/2005, 11h34
  5. Debit descendant plutot lent
    Par KibitO dans le forum Dépannage et Assistance
    Réponses: 8
    Dernier message: 16/01/2005, 22h09

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