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

Langage Java Discussion :

Telechargement de fichiers et blocage complet de ma connexion internet !


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 23
    Points
    23
    Par défaut Telechargement de fichiers et blocage complet de ma connexion internet !
    Bonjour,

    J'ai une appli qui recupere des fichiers sur le web grace a un fichier XML que je lui fourni.

    Le probleme est que parfois, le programme va commencer et planter (a cause de la connexion qui a disparu) des le debut, et par moment il va me telecharger une centaine de fichiers puis planté pour la même raison.
    Pour info je tourne avec 4 threads a la fois au maximum, chacun ayant une petite liste de fichier a telecharger (de 1 a 4 en moyenne), les fichiers telecharger font de quelques Ko a plusieurs dizaines de Mo.

    Probleme : Pourquoi ca plante !!! Auriez vous des idées sur les causes // solutions ???

    J'espere que vous pourrez m'aider car pour l'instant ca ressemble plus à ça =>

    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
     
    URL url = new URL(LIEN);
    out = new BufferedOutputStream(new FileOutputStream(localFileName));
    conn = url.openConnection();
    in = conn.getInputStream();
    int taille = conn.getContentLength();				
    System.out.println(this.toString()+"\tTaille =\t"+taille);
    System.out.println(this.toString()+"\tURL =\t"+LIEN);
    byte[] buffer = new byte[1024];
    int numRead;
    long count = 0;			
    while ((numRead = in.read(buffer)) != -1)
    	{
    	out.write(buffer, 0, numRead);
    	count += numRead;
    	}

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    T'as regardé l'utilisation de la ram par ta jvm pendant l'execution ? Connaissant la magie java, je dirais qu'il y a de grandes chances que ça saute par overflow.

  3. #3
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Enfin il faudrait surtout te retourner la question :
    Pourquoi ca plante !!! Auriez vous des idées sur les causes // solutions ???
    Java propose un mécanisme d'exception très complet qui informe sur le(s) problèmes rencontrés.

    Sans connaitre cette exception on ne peut rien pour toi, si ce n'est des supposition.

    a++

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Et bien le probleme que j'ai c'est que avant et aprés le téléchargement je tape dans une base de données et je recupere une erreur du type "SQLconnectexception". En plus simple y me dit qu'il n'arrive plus a atteindre une machine qui de plus est sur un reseau local. Pendant ce temps la je n'ai plus du tout accés au net et tout se coupe. Puis dés que j'arrete mon appli (qui ne fait plus rien de toute facon) ma connexion revient ...
    Je pencherai aussi pour la RAM par contre je ne refuse pas les conseils pour controler tout ca ou au moins l'outils je me debrouillerai apres

    Pour info je travaille sous Eclipse, Je fais regulierement des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.gc();
    System.runFinalization();
    System.gc();
    ceci afin de, je pense, liberer un peux la JVM.
    Et bien entendu je verifie bien que toute mes connexions restent bien fermer en fin de parcours.

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2006
    Messages
    572
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 572
    Points : 631
    Points
    631
    Par défaut
    Citation Envoyé par deadliff Voir le message
    Pour info je travaille sous Eclipse, Je fais regulierement des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.gc();
    System.runFinalization();
    System.gc();
    ceci afin de, je pense, liberer un peux la JVM.
    En fait, sur le site il y a un article sur le GC, qui n'est pas magique.

    System.gc() ne fait pas grand chose.

    En fait le gc libere en priorité les zones mémoires qui ne sont pointées par rien et qui ont été allouées il y a peu de temps.

    Donc pour un peu que qqpart tu gardes une référence sur un de tes fichier et tout saute.

    Pour vérifier, je te conseille le ctrl+alt+suppr sous win, et il doit bien y avoir un équivalent sur les autres systèmes qui te permettraient de vérifier que c'est bien ta mémoire qui saute.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Effectivement la JVM ne fait que grimper coté mémoire ... Et bien entendu elle ne redescend pas, même aprés mon fameuse appele au Garbage Collector !

  7. #7
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par deadliff Voir le message
    Et bien le probleme que j'ai c'est que avant et aprés le téléchargement je tape dans une base de données et je recupere une erreur du type "SQLconnectexception".
    On pourrait avoir l'erreur complète ?

    Citation Envoyé par deadliff Voir le message
    En plus simple y me dit qu'il n'arrive plus a atteindre une machine qui de plus est sur un reseau local.
    Ton application te parle ! Cool

    ... si c'est une exception ce serait intéressant de la voir...

    Citation Envoyé par deadliff Voir le message
    Pour info je travaille sous Eclipse, Je fais regulierement des :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    System.gc();
    System.runFinalization();
    System.gc();
    Au mieux ta JVM ignorera cela et ne fait rien. Au pire cela te plombe les performances de ton application (Un exemple : Difference de performances Unix/Windows d'un programme, à cause d'un abus de gc()).


    Pour tester tu peux lancer ton programme avec -XX:-DisableExplicitGC, ce qui désactivera les System.gc()...

    a++

  8. #8
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par deadliff Voir le message
    Et bien entendu je verifie bien que toute mes connexions restent bien fermer en fin de parcours.
    Pourtant cela ne semble pas être le cas dans le code que tu nous as donné...

    a++

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Août 2002
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    D'autant plus que le GC est exécuté dans un thread à basse priorité... Donc aucun effet.

    System.gc();
    System.runFinalization();
    System.gc();
    De plus, l'appel à la méthode runFinalization est strictement inutile puisqu'elle est appelée par le GC juste avant la destruction de l'objet. C'est une méthode pré-mortem...
    Donc consommation de ressources inutiles...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2002
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Août 2002
    Messages : 35
    Points : 37
    Points
    37
    Par défaut
    Aussi, peut-être utilises-tu une de tes connections dans ton thread principal ?

    Mieux vaut éviter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static void main( String[] args )
    {
         new Connection();
    }
    au profit de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static void main( String[] args )
    {
         new Thread
         {
              public void run()
              {
                   new Connection();
              }
         }
    }

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Bon je suis en train de vous preparer mon code de facon clair et propre et je vous le montre plus complet qu'il ne l'ai plus haut.
    Et merci pour tout les conseils.

    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
    OutputStream out = null;
    URLConnection conn = null;
    InputStream  in = null;
    File localFileName = new File(dossier_local+nomfichier);
     
    try 
    	{
    	URL url = new URL(LIEN);
    	out = new BufferedOutputStream(new FileOutputStream(localFileName));
    	conn = url.openConnection();
    	in = conn.getInputStream();
    	int taille = conn.getContentLength();				
    	byte[] buffer = new byte[2048];
    	int numRead;
    	long count = 0;	
    	while ((numRead = in.read(buffer)) != -1)
    		{
    		out.write(buffer, 0, numRead);
    		count += numRead;
    		}
    	if(taille != count)
    		{
    		throw new FileNotFoundException();					
    		}					
    	if(count == 0)
    		{
    		//Enregistrement en base de données de l'erreur
    		//C'est dans ses tentatives d'accés a la base
    		//que mon appli me fait comprendre que je n'ai plus de connexion
    		}			
    	if(count == taille)
    		{
    		//Traitement quand telechargement reussi
    		}		
     
    	}
    catch (FileNotFoundException fnfe)
    	{
    	//Enregistrement en base de données de l'erreur
    	//C'est dans ses tentatives d'accés a la base
    	//que mon appli me fait comprendre que je n'ai plus de connexion	
    	}
    catch(IOException ioe)
    	{	
    	//Enregistrement en base de données de l'erreur
    	//C'est dans ses tentatives d'accés a la base
    	//que mon appli me fait comprendre que je n'ai plus de connexion
    	}				
    catch (Exception e) 
    	{
    	e.printStackTrace();
    	}				
    finally 
    	{
    	try 
    		{
    		if (in != null)
    			{
    			in.close();
    			}
    		if (out != null)
    			{
    			out.close();
    			}
    		} 
    	catch (IOException ioe)
    		{
    		ioe.printStackTrace();
    		}
    	}

    Je relance mon appli et dés que l'erreur reviens je vous en fait part.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Voila l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    com.microsoft.sqlserver.jdbc.SQLServerException: Échec de la connexion TCP/IP à l'hôte . java.net.ConnectException: Connection timed out: connect
    	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(Unknown Source)
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.loginWithoutFailover(Unknown Source)
    	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(Unknown Source)
    	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(Unknown Source)

    Je precise que ma base est sur un autre poste.
    Bien entendu comme je l'ai expliquer plus haut je constate au meme moment une coupure total du net sur mon poste (IE, MSN, Mail, plus rien ne passe).

    Des idées ?

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Et voici l'erreur encore plus exact une fois que j'ai desactivé mes entrées en base :

    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
    java.net.ConnectException: Connection timed out: connect
    	at java.net.PlainSocketImpl.socketConnect(Native Method)
    	at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    	at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    	at java.net.Socket.connect(Socket.java:519)
    	at java.net.Socket.connect(Socket.java:469)
    	at sun.net.NetworkClient.doConnect(NetworkClient.java:157)
    	at sun.net.www.http.HttpClient.openServer(HttpClient.java:382)
    	at sun.net.www.http.HttpClient.openServer(HttpClient.java:509)
    	at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:278)
    	at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:335)
    	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:176)
    	at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:769)
    	at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:162)
    	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:938)
    	at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 31
    Points : 23
    Points
    23
    Par défaut
    Aprés un coup de menage dans le code l'erreur ne revient plus !
    Problemes de ressources surement.

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

Discussions similaires

  1. Wget - télécharger des fichiers non-html
    Par narmataru dans le forum Réseau
    Réponses: 10
    Dernier message: 14/07/2018, 16h20
  2. Telechargement de fichier
    Par ArkAng3 dans le forum MFC
    Réponses: 1
    Dernier message: 31/10/2005, 12h32
  3. [Telechargement de Fichier] Recherche balise adéquate
    Par Kylen dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 12/09/2005, 16h21
  4. telecharger un fichier
    Par mokha8581 dans le forum Langage
    Réponses: 2
    Dernier message: 10/09/2005, 15h15
  5. [VB6] Télécharger un fichier avec VB 6
    Par lechevbt dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 18/02/2004, 21h05

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