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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 : 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
    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
    Membre confirmé
    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
    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 : 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
    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
    Membre confirmé
    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
    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 : 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
    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.

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

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