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 :

Transfert de fichier par socket client vers client


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut Transfert de fichier par socket client vers client
    Bonjour

    Je suis entrain de faire une messagerie instantannée et j'implémente en ce moment le transfert de fichier.

    Je me demandais s'il y avait moyen d'envoyer un fichier via une socket client vers une socket client sans pour autant passer par le serverSocket qui se trouve évidement sur mon serveur de messagerie instantannée.

    Tout les exemples et tutorials que je trouve concernent toujours l'envoi et/ou la réception d'un fichier venant d'un client/serveur vers un serveur/client.

    Si quelqu'un pouvait me donner son avis et la façon dont il procèderait, cela m'aiderai bien.

    Dasson

  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 : 42
    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
    Il te faut mettre un ServerSocket côté client. Ton client devient donc un serveur. Tu n'as pas le choix, il faut bien à un moment donné que le client récepteur soit préparé pour la réception du fichier.
    Tu pourrais, par exemple, transmettre une commande spécial au client pour qu'il démarre son ServerSocket et n'accepte qu'un client bien précis, puis arrête le ServerSocket lorsque le transfert est terminé.
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    Oki doki, c'est ce que je pensais en premier lieu.

    Mais de cette manière, est ce que je devrai fermer la serverSocket après le transfert du fichier ou je peux la laisser ouverte pour éventuellement transmettre un autre fichier plus tard dans la conversation, comme il peut se passer habituellement dans une conversation msn, google talk, et j'en passe quoi.

    Merci pour la réponse.

    Dasson

  4. #4
    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 : 42
    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 Dasson Voir le message
    Mais de cette manière, est ce que je devrai fermer la serverSocket après le transfert du fichier ou je peux la laisser ouverte pour éventuellement transmettre un autre fichier plus tard dans la conversation, comme il peut se passer habituellement dans une conversation msn, google talk, et j'en passe quoi.
    C'est toi qui choisis le fonctionnement. Tu peux très bien laisser un serveur permanent sur ton client. Mais c'est inutile. L'utilisateur ne verra pas de différence entre un ServerSocket permanent ou uniquement lancer pour un transfert. Donc autant éviter l'ouverture d'un port lorsque ce n'est pas la peine.
    Mais c'est à toi de voir
    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.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    Voilà j'ai créer le serverSocket pour le client, mais il s'avère que j'ai un petit problème. Comment je fais pour que le client 2 puisse récupérer l'adresse IP du client 1 pour que le client 2 puisse recevoir le fichier.

    Je bloque totalement à cet endroit et je ne vois aucun moyen pour que le client 2 puisse recevoir l'adresse IP du client 1. Une idée quelconque ?

    Voici les codes pour envoie et reception de fichier :
    FileSender
    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
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.ServerSocket;
    import java.io.File;
    import java.io.IOException;
     
    public class FileSender extends Thread{
     
    	private ServerSocket socketListener;
    	private Socket socket;
    	private File fileToSend;
    	private InetAddress ipAddress;
     
    	public FileSender(File fileToSend){
    		this.fileToSend = fileToSend;
    		try{
    			socketListener = new ServerSocket(15000);
    			ipAddress = socketListener.getInetAddress();
    		}
    		catch(IOException e){
    			System.out.println("Impossible d'écouter sur ce port");
    		}
    		start();
    	}
     
    	public InetAddress getIpAddress() {
    		return ipAddress;
    	}
     
    	public void setIpAddress(InetAddress ipAddress) {
    		this.ipAddress = ipAddress;
    	}
     
    	public void run(){
    		try{
    			socket = socketListener.accept();
    			new FileTransfer(socket,fileToSend);
    			socket.close();
    			socketListener.close();
    		}
    		catch(IOException e){
    			System.out.println("Erreur d IO");
    		}
    	}
    }
    FileTransfer
    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
    import java.net.Socket;
    import java.io.FileInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.io.FileNotFoundException;
     
    public class FileTransfer extends Thread{
     
    	private File fileToSend;
    	private Socket socket;
    	private DataOutputStream dataOut;
    	private FileInputStream fis = null;
     
    	public FileTransfer(Socket socket, File fileToSend){
    		super();
    		this.socket = socket;
    		this.fileToSend = fileToSend;
     
    		try{
    			dataOut = new DataOutputStream(this.socket.getOutputStream());
    		}
    		catch(IOException e){
    			System.out.println("Erreur d IO");
    		}
    		boolean fileExists = true;
    		try{
    			//Flux de lecture dans le fichier
    			fis = new FileInputStream(this.fileToSend);
    		}
    		catch(FileNotFoundException e){
    			fileExists = false;
    		}
     
    		if(fileExists){
    			//Creation d'un buffer de 2Ko
    			byte[] buffer = new byte[2048];
    			int bytes = 0;
     
    			try{
    				//Envoie du nom du fichier dans le flux de sortie
    				dataOut.writeUTF(fileToSend.getName());
     
    				//Copie du fichier dans le flux de sortie
    				while((bytes = fis.read(buffer))!= -1){
    					dataOut.write(buffer,0,bytes);
    				}
    				fis.close();
    			}
    			catch(IOException e){
    				System.out.println("Erreur d IO");
    			}
    		}
    	}
    }
    FileReceive
    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
    import java.net.InetAddress;
    import java.net.Socket;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
     
    public class FileReceiver {
     
    	private Socket socket;
    	private DataInputStream dataIn;
    	private FileOutputStream fos;
    	private File file;
     
    	public FileReceiver(InetAddress ipAddress, String path){
    		int i;
    		try{
    			socket = new Socket(ipAddress,15000);
    			dataIn = new DataInputStream(socket.getInputStream());
     
    			file = new File(path);
    			fos = new FileOutputStream(file);
    			while((i = dataIn.read())!= -1){
    				fos.write(i);
    			}
    			socket.close();
    		}
    		catch(IOException e){
    			System.out.println("Erreur d IO");
    		}
    	}	
    }
    et le bout de code où tout doit se passer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if(message.equals(I18N.getString("fenetrechat.discussion.sendfile"))){
    							int retour = JOptionPane.showConfirmDialog(null,I18N.getString("fenetrechat.discussion.sendfile"),I18N.getString(jabberid+" fenetrechat.discussion.sendfile.condition"),JOptionPane.OK_OPTION);
    							if(retour == 0){
    								System.out.println(I18N.getString("fenetrechat.discussion.sendfile.ok"));
    								//FileReceive(ipadress,chemin);
    							}
    							else{
    								System.out.println("NON pour le fichier");
    							}
    						}
    						else if(message.equals(I18N.getString("fenetrechat.discussion.sendfile.ok"))){
    							new FileSender(file);
    						}
    Merci bien du coup de main.

    Dasson

    EDIT : Je ne saurai pas répondre aux messages après 17h20 car c'est du code qui vient du boulot. Merci ^^

  6. #6
    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 : 42
    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
    Pour transmettre l'adresse du client 2 au client 1, il te faut établir un protocole particulier avec des mots clés. Par exemple, si c1 veut envoyer un fichier à c2, on peut imaginer le protocole suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c1->c2 : "0x00/ip[?]"
    c2->c1 : 0x00/ip[192.168.0.1]
    Le premier caractère a le code ascii zéro.
    Il te suffit d'analyser les chaînes sur chaque client pour savoir si c'est du texte à afficher ou si c'est une commande interne. Comme les commandes commencent par un caractère non imprimable, tu peux être sûr à 99.99% qu'un utilisateur n'écrira pas une chaîne qui commence par 0x00.
    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.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    OK donc en gros voilà ce qu'il devrait se passer d'après ton explication :

    - le client 1 veut envoyer un fichier au client 2
    - le client 1 envoie un code au client 2 pour que ce dernier puisse choisir entre accpeter ou refuser le fichier
    - si le client 2 accepte alors il envoie un code pour dire que c'est ok
    - si le client 1 reçoit le code de validation, il envoie un code pour qui comprend son adresse ip et de là le transfert peut commencer.

    Voilà ce que je pense qu'il doit se passer et si c'est bien ce à quoi tu penses également.

    Tu peux m'en dire plus à propos des codes que je devrai utiliser car mon programme sera capable d'envoyer des caractères grec, cyrilliques, et dans les langues officielles de l'Europe. Ca serait vraiment stupide qu'un code correspond à un mot dans une langue parlé ^^.

    Merci bien

    Dasson

  8. #8
    Membre éclairé
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Points : 844
    Points
    844
    Par défaut
    Pour que le client 1 connaisse l'adresse IP du client 2, cette connaissance doit passer par le serveur Client 1 <----> serveur <----> client 2
    Ensuite tu peu imaginer établir une connection client 1 <----> client 2 pour squizzer le serveur
    JBusyComponent, une API pour rendre occupé un composant swing.
    SCJP Java 6.0 (90% pass score)

  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 : 42
    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
    On peut simplifier la dernière étape :
    Citation Envoyé par Dasson Voir le message
    - le client 1 veut envoyer un fichier au client 2
    - le client 1 envoie un code au client 2 pour que ce dernier puisse choisir entre accpeter ou refuser le fichier
    - si le client 2 accepte alors il envoie un code avec son ip pour dire que c'est ok
    - si le client 1 reçoit le code de validation avec l'ip, le transfert peut commencer.
    Pour le protocole de communication interne, c'est à toi de décider entièrement ce que tu envois. J'imagine que tu vas utiliser de l'unicode. Or les codes caractères ASCII sont inclus dans l'unicode. Donc le code zéro peut être utiliser sans problème pour avertir un client que c'est une commande interne.
    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.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    J'ai oublié de te demander une confirmation, les codes, tu les envoies en tant que String à travers un message sauf qu'au lieu d'afficher le message dans la fenetre de conversation, tu fais la manipulation adéquates je suppose.

    Dasson

  11. #11
    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 : 42
    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 Dasson Voir le message
    J'ai oublié de te demander une confirmation, les codes, tu les envoies en tant que String à travers un message sauf qu'au lieu d'afficher le message dans la fenetre de conversation, tu fais la manipulation adéquates je suppose.
    Comme déjà dit précédemment, oui, c'est ça.
    Chaque client reçoit un flux. Il lit le premier caractère. Si c'est zéro, la suite du flux est une commande. Sinon, il affiche ce premier caractère et la suite du flux dans une zone d'affichage pour l'utilisateur.
    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.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    Oki doki

    Merci bien pour l'aide, tu viens d'éclairer mon ampoule ^^.

    Je mettrai le code complet quand j'aurai fini tout cela.

    Dasson

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    Voilà, j'ai fini plus ou moins le transfert de fichier. J'ai bien utilisé différents code pour l'envoie d'un fichier, ou de l'IP, ... mais pas avec du code ascii car les caractères passaient par un parser XML, donc plantage lors de la lecture de ces caractères.

    Je l'ai reglé par moi même en formant mon propre code.

    Mais un petit problème survient lors de la lecture du fichier via l'explorateur.

    En effet c'est lors de la copie d'un fichier .doc par exemple, lorsque je veux le réouvrir les caractères ne correspondent plus du tout au fichier original.

    J'avoue que je n'ai pas trop chercher sur le forum après ce problème, donc s'il y a un lieu quelconque, je suis preneur.

    Dasson

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    Bon j'ai toujours un problème.

    Lorsque je transfère un fichier .doc ou .txt, lorsque je l'ouvre il n'y a soit rien d'écrit dans le fichier, soit les caractères sont illisibles. Quand c'est un fichier .jpg ou .mp3, je n'arrive tout simplement pas à afficher l'image ou à écouter la musique.

    Voici les codes de transfers de fichier :

    Initialisation de l'envoie :
    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
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.ServerSocket;
    import java.io.File;
    import java.io.IOException;
     
    public class FileSender extends Thread{
     
    	private ServerSocket socketListener;
    	private Socket socket;
    	private File fileToSend;
    	private InetAddress ipAddress;
     
    	public FileSender(File fileToSend){
    		this.fileToSend = fileToSend;
    		try{
    			socketListener = new ServerSocket(15000);
    		}
    		catch(IOException e){
    			System.out.println("Impossible d'écouter sur ce port");
    		}
    		start();
    	}
     
    	public InetAddress getIpAddress() {
    		return ipAddress;
    	}
     
    	public void setIpAddress(InetAddress ipAddress) {
    		this.ipAddress = ipAddress;
    	}
     
    	public void run(){
    		try{
    			socket = socketListener.accept();
    			ipAddress = socket.getLocalAddress();
    			new FileTransfer(socket,fileToSend);
    		}
    		catch(IOException e){
    			System.out.println("Erreur d IO");
    		}
    	}
    Envoie du fichier :
    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
    import java.net.Socket;
    import java.io.FileInputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.io.FileNotFoundException;
     
    public class FileTransfer extends Thread{
     
    	private File fileToSend;
    	private Socket socket;
    	private DataOutputStream dataOut;
    	private FileInputStream fis = null;
     
    	public FileTransfer(Socket socket, File fileToSend){
    		super();
    		this.socket = socket;
    		this.fileToSend = fileToSend;
     
    		try{
    			dataOut = new DataOutputStream(this.socket.getOutputStream());
    		}
    		catch(IOException e){
    			System.out.println("Erreur d IO");
    		}
    		boolean fileExists = true;
    		try{
    			//Flux de lecture dans le fichier
    			fis = new FileInputStream(this.fileToSend);
    		}
    		catch(FileNotFoundException e){
    			fileExists = false;
    		}
     
    		if(fileExists){
    			//Creation d'un buffer de 4Ko
    			byte[] buffer = new byte[4096];
    			int bytes = 0;
     
    			try{
    				//Envoie du nom du fichier dans le flux de sortie
    				dataOut.writeUTF(fileToSend.getName());
     
    				//Copie du fichier dans le flux de sortie
    				while((bytes = fis.read(buffer))!= -1){
    					dataOut.write(buffer,0,bytes);
    				}
    				fis.close();
    				this.socket.close();
    			}
    			catch(IOException e){
    				System.out.println("Erreur d IO");
    			}
    		}
    	}
    }
    et reception du fichier :

    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
    import java.net.InetAddress;
    import java.net.Socket;
    import java.io.DataInputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
     
    public class FileReceiver {
     
    	private Socket socket;
    	private DataInputStream dataIn;
    	private FileOutputStream fos;
    	private File file;
     
    	public FileReceiver(InetAddress ipAddress, String path){
    		int i;
    		try{
    			socket = new Socket(ipAddress,15000);
    			dataIn = new DataInputStream(socket.getInputStream());
    			byte[] buffer = new byte[4096];
    			file = new File(path);
    			fos = new FileOutputStream(file);
    			while((i = dataIn.read(buffer))!= -1){
    				fos.write(i);
    			}
    			fos.close();
    		}
    		catch(IOException e){
    			System.out.println("Erreur d IO lors de la reception");
    			e.printStackTrace();
    		}
    	}
    Merci d'avance pour cette aide.

    Dasson

  15. #15
    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 : 42
    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
    Tu n'as pas mis le code qui correspond à la lecture du nom du fichier en début de flux.
    Ensuite, lorsque le fichier reçu n'est pas vide, quel est sa taille ? Aléatoire ? Egale au fichier initial ?
    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.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    Je ne comprends pas ce que tu veux dire par oublier la lecture du nom du fichier en début de flux, tu peux m'éclaircir là dessus s'il te plait ?

    Sinon le fichier qu'on envoie peut être de n'importe quel type et donc de taille aléatoire mais sa taille ne doit pas varier lors du transfert. C'est cela que tu voulais savoir ?

    Merci

    Dasson

  17. #17
    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 : 42
    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 Dasson Voir le message
    Je ne comprends pas ce que tu veux dire par oublier la lecture du nom du fichier en début de flux, tu peux m'éclaircir là dessus s'il te plait ?
    Pour le nom du fichier en début de flux, c'est dans la classe "FileTransfer". Tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //Envoie du nom du fichier dans le flux de sortie
    dataOut.writeUTF(fileToSend.getName());
    Or, Dans la méthode de récupération du fichier, tu ne lis pas le nom du fichier. En plus, le nom n'est pas séparé de son contenu lorsque tu l'envoies. Donc à la lecture, ça va être difficile de savoir ou s'arrêter dans le flux pour reconstruire le nom du fichier.

    Sinon le fichier qu'on envoie peut être de n'importe quel type et donc de taille aléatoire mais sa taille ne doit pas varier lors du transfert. C'est cela que tu voulais savoir ?
    Oui, c'est ça
    Par contre, je ne comprend pas pourquoi le fichier transféré est parfois vide
    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.

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    bha moi non plus je ne sais pas pourquoi sinon je poserai pas la question ^^.

    Donc pour toi je devrai rajouter la méthode dataIn.readUTF() dans ma classe FileReceiver ? Si oui pourrais tu me dire à quel endroit ?

    Moi je le mettrai avant l'écriture dans le fichier. Est ce que je dois récupérer le string ou pas ?

    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
    public FileReceiver(InetAddress ipAddress, String path){
    		int i;
    		try{
    			socket = new Socket(ipAddress,15000);
    			dataIn = new DataInputStream(socket.getInputStream());
    			byte[] buffer = new byte[4096];
    			file = new File(path);
    			fos = new FileOutputStream(file);
    			//Lecture du nom du fichier
    			dataIn.readUTF();
    			while((i = dataIn.read(buffer))!= -1){
    				fos.write(i);
    			}
    			fos.close();
    		}
    		catch(IOException e){
    			System.out.println("Erreur d IO lors de la reception");
    			e.printStackTrace();
    		}
    	}

  19. #19
    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 : 42
    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 Dasson Voir le message
    Donc pour toi je devrai rajouter la méthode dataIn.readUTF() dans ma classe FileReceiver ? Si oui pourrais tu me dire à quel endroit ?

    Moi je le mettrai avant l'écriture dans le fichier. Est ce que je dois récupérer le string ou pas ?
    Oulala ! Stop. C'est toi qui écris le nom du fichier dans le flux. Si tu ne t'en sers pas à la réception, alors ne l'écris pas
    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.

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 96
    Points : 39
    Points
    39
    Par défaut
    En fait le nom du fichier est déjà inscris dans le path lorsque je fais file = new File(path);

    Bon je vais voir sans utilisé le dataOut.writeUTF() dans ma classe de Transfer.

    Dasson

    EDIT : Non ça ne fonctionne toujours pas. Tu pourrais me mettre ta technique à toi s'il te plait?

    Merci bien

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Socket] Envoyer données client vers serveur et inversement
    Par Ryuuzaki92 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 31/10/2011, 13h39
  2. Transfert fichier par socket
    Par allserv dans le forum Réseau
    Réponses: 1
    Dernier message: 21/10/2008, 16h30
  3. Transfert de fichiers par socket
    Par hebus44 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 27/10/2007, 13h55
  4. Réponses: 17
    Dernier message: 15/05/2007, 18h35
  5. Transfert de fichiers par sockets
    Par Kaori dans le forum C++
    Réponses: 19
    Dernier message: 26/01/2005, 13h58

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