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 :

Libérer les ressources


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut [RESOLU]Libérer les ressources
    Bonjour,
    J'ai un petit problème, j'ai un code qui fait un copier coller d'un fichier, le voici:

    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
    import java.net.*;
    import java.io.*;
     
    public class clientcopie implements Runnable {
     
    	Socket client;
    	String chemin;
     
    	public clientcopie(Socket client, String chemin) {
    		this.client = client;
    		this.chemin = chemin;
    	}
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		byte tab[] = new byte[1024];
    		File fichier = new File(chemin);
    		try {
    		FileInputStream reader = new FileInputStream(fichier);
    		int nbreoctet = 0;
    		System.out.println(chemin);
    		while(true) {
    			nbreoctet = reader.read(tab);
    			if(nbreoctet == -1)
    				break;
    			client.getOutputStream().write(tab, 0, nbreoctet);
    			client.getOutputStream().flush();
    			tab = new byte[1024];
    		}
    		reader.close();
     
    		}catch(Exception e) { e.printStackTrace(); }
    	}
     
    }
    Comme vous le voyez, le nom du fichier à copier est envoyé par un autre programme, jusque là tout va bien, le fichier à copier est envoyé via les socket et reçu de l'autre côté avec ce 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
    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
    import java.io.*;
    import java.net.*;
    import java.awt.image.*;
    import javax.imageio.*;
    import javax.swing.*;
     
    public class captureserveur implements Runnable {
     
    	Socket client;
    	File fichier;
     
    	public captureserveur(Socket client) {
    		this.client = client;
    	}
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		String nom = "capture";
    		fichier = new File("capture");
    		try {
    			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
    			//initialisation de la copie cote client
    			writer.write("/capture\n");
    			writer.flush();
    		BufferedOutputStream writerfichier = new BufferedOutputStream(new FileOutputStream(fichier));
    		byte tab[] = new byte[1024];
    		int nbreoctet = 0;
    		try{
    		while(true) {
    			nbreoctet = client.getInputStream().read(tab);
    			if(nbreoctet == -1) 
    				break;
    			writerfichier.write(tab, 0, nbreoctet);
    			writerfichier.flush();
    			tab = new byte[1024];
    		}
     
    		client.getInputStream().close();
     
    		}finally {
    			writerfichier.close();
     
    		}
    		}catch(Exception e) { e.printStackTrace(); }
    	}
     
    }
    Jusque là pas de problème, sauf que lorsque je veux lancer le fichier copié, je ne peux pas, il me dit que c'est utilisé par un autre programme.
    Savez vous comment je peux faire pour libérer la ressource?
    j'ai essaye de mettre un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    client.getOutputStream.close();
    Dans le premier code, mais il me fermait toute la socket, ce que je ne veux pas.

    merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    comme ta socket n'est jamais fermée coté émetteur, tu ne sort jamais de ta boucle while coté client, tu ne ferme donc jamais non plus le fichier de sortie car tu n'atteint jamais cette ligne de code.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    Merci de ta réponse, mais je ne comprends pas,
    La boucle while côté client se ferme lorsque le fichier est terminé d'être lu

  4. #4
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Ce qu'il veut dire c'est que tu fermes le flux I/O du fichier mais que tu ne fermes pas celui du socket. Essayes de rajouter un client.close() une fois le fichier transféré.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    Ok merci, mais si je veux que le client reste connecté afin de faire directement plusieurs transfert sans être obligé de reconnecté la socket client à chaque fois?

  6. #6
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Tu ne fermes jamais cet objet. Essayes pour voir. Cela dit comme je ne sais pas exactement où se situe ton problème c'est difficile de t'aider. Qu'entends-tu par "lancer le fichier copié" ?

  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 : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Un peu hors sujet, mais indispensable pour la clarté de ton code et l'utilisation correcte de l'API : tu n'as manifestement pas compris l'utilité du "BufferedOutputStream". Le tableau "tab" ne doit pas être reconstruit après chaque utilisation dans la boucle. De plus, le "flush" doit se faire en sortie de boucle.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    Je ne comprends pas pourquoi le flush doit se faire en sortie de boucle.
    Il faut que le buffer soit vidé afin que les données soient bien écrites dans le fichier non?
    Pour le tab ok

    Sinon je suis obligé de déconnecter le client pour que le File soit libéré?

    Encore merci

  9. #9
    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 : 43
    Localisation : France

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par xokami35x Voir le message
    Je ne comprends pas pourquoi le flush doit se faire en sortie de boucle.
    Le BufferedOutputStream attend que le buffer soit plein avant d'écrire physiquement les données puis vider le buffer. Le flush est gérer automatiquement. C'est uniquement lorsque l'écriture s'arrête qu'il faut avertir le BufferedOutputStream via un flush explicite.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par xokami35x Voir le message
    Ok merci, mais si je veux que le client reste connecté afin de faire directement plusieurs transfert sans être obligé de reconnecté la socket client à chaque fois?
    Alors, tu est obligé de transmettre, d'une manière ou d'une autre, à ton client qu'on a atteind la fin du fichier. Ca peut se faire, par exemple, en envoyant, avant le fichier, sa taille. Ainsi, le client aura juste a lire n bytes, pas un de plus, sur la socket, et la socket sera ensuite réutilisable pour d'autres choses. Bref, c'est à toi de clairement défini le protocole entre le client et le serveur afin de déterminer comment, par exemple, le client sait que tu va lui envoyer un fichier, comment le serveur sati qu'il doit envoyer un fichier, comment le fichier doit être envoyé, etc.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 213
    Points : 43
    Points
    43
    Par défaut
    Et bah je vous remercie énormement tous les deux.

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

Discussions similaires

  1. Libérer les ressources d'une fenêtre
    Par MiniCesc dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 29/09/2010, 11h22
  2. Libérer les ressources
    Par mouloudéen dans le forum ASP.NET
    Réponses: 1
    Dernier message: 18/03/2009, 09h46
  3. [SWT] Libérer les ressources
    Par soft0613 dans le forum SWT/JFace
    Réponses: 15
    Dernier message: 04/08/2008, 13h32
  4. Réponses: 3
    Dernier message: 09/10/2006, 19h22
  5. Libérer les ressources lors de la fermeture d'un programme
    Par Heliopraetor dans le forum DirectX
    Réponses: 10
    Dernier message: 14/09/2004, 19h15

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