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 :

Transférer un fichier sur un serveur HTTP


Sujet :

Entrée/Sortie Java

  1. #21
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    En gros, voici le code :
    Côté serveur:
    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
     
    //Attente des clients
    		try{
    			//Attendre les clients
    			services_socket = serveur_socket.accept();
    			System.out.println("Un client souhaite envoyer un fichier...");
    		}
    		catch(IOException ex){
    			System.err.println(ex);
    		}
    		//Récupération du nom du fichier
    		try{
    			//Récupérer le flux de données
    			BufferedReader flux_entree = new BufferedReader(
    				new InputStreamReader(
    					services_socket.getInputStream()
    				)
    			);
    			donnees_recues = flux_entree.readLine();
    			System.out.println("Données reçues : " + donnees_recues);
    		}
    		catch(IOException ex){
    			System.err.println(ex);
    		}
    		try{
    			//Création du fichier
    			flux_ecriture = new BufferedWriter( new FileWriter(donnees_recues), 1);
    		}
    		catch(IOException ex){
    			System.err.println(ex);
    		}
    		//Envoi de la confirmation au client
    		try{
    			//Envoyer le flux de données
    			String donnees_envoyees = "OK";
    			System.out.println("Envoi des données : " + donnees_envoyees);
    			DataOutputStream flux_sortie = new DataOutputStream(
    				services_socket.getOutputStream()
    			);
    			System.out.println("+++");
    			flux_sortie.writeBytes(donnees_envoyees);
    			System.out.println("Données envoyées : " + donnees_envoyees);
    		}
    		catch(IOException ex){
    			System.err.println(ex);
    		}
    Côté client :
    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
     
    //Creation de la socket client
    					Socket client_socket = null;
    					try{
    						//Création de la socket client
    						client_socket = new Socket("192.168.0.101", 5555);
    					}
    					catch(IOException ex){
    						System.err.println(ex);
    					}
    					//Envoi du nom du fichier
    					try{
    						String donnees_envoyees = name;
    						//Création du flux de sortie
    						DataOutputStream flux_sortie = new DataOutputStream(
    							client_socket.getOutputStream()
    						);
    						flux_sortie.writeBytes(donnees_envoyees);
    						System.out.println("Données envoyées : " + donnees_envoyees);
    					}
    					catch(IOException ex){
    						System.err.println(ex);
    					}
    					//Récupération de la réponse du serveur
    					try{
    						//Récupérer le flux de données
    						String donnees_recues = null;
    						//Création du flux d'entrée
    						BufferedReader flux_entree = new BufferedReader(
    							new InputStreamReader(
    								client_socket.getInputStream()
    							)
    						);
    						donnees_recues = flux_entree.readLine();
    						System.out.println("Données reçues : " + donnees_recues);
    					}
    					catch(IOException ex){
    						System.err.println(ex);
    					}
    Je comprends pas pourquoi ça bloque...

  2. #22
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    J'ai trouvé, il suffisait que la String contienne un '\n' à la fin.
    Je termine l'application...

  3. #23
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    Bon elle fonctionne à moitié.
    Le problème : c'est que je n'ouvre pas mes fichiers en binaire mais en mode caractères. Donc pour des fichiers textes, qu'ils soient gros ou non ça passe, mais pour des fichiers image ou autre ça ne passe pas. Le fichier final est souvent corrompu dès qu'il est gros.
    Donc là j'essaye maintenant de ne travailler qu'avec du byte.
    Côté serveur:
    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
     
    import java.io.*;
    import java.net.* ;
     
    class ServerTCPTest{
    	public static void main(String[] args) throws Exception{
    		//Création de la socket serveur
    		ServerSocket serveur_socket = new ServerSocket(5555);
    		System.out.println("Le serveur est en état de marche (" + serveur_socket.getLocalSocketAddress() + ").");	
    		//Attente des clients
    		Socket services_socket = serveur_socket.accept();
    		System.out.println("Un client souhaite envoyer un fichier...");
    		//Création des flux E/S
    	        //BufferedReader flux_entree = new BufferedReader(new InputStreamReader(services_socket.getInputStream()));
    		DataInputStream  flux_entree = new DataInputStream(services_socket.getInputStream()); 
    		DataOutputStream  flux_sortie = new DataOutputStream(services_socket.getOutputStream()); 
    		//Récupération du nom du fichier
    		byte[] donnees_recues = new byte[1024];
    		flux_entree.read(donnees_recues, 0, 1024);
    		System.out.println("Données reçues : " + new String(donnees_recues));
    		//Création du fichier
    		//BufferedWriter flux_ecriture = new BufferedWriter(new FileWriter(donnees_recues), 1);
    	        DataOutputStream flux_ecriture = new DataOutputStream(new FileOutputStream(new String(donnees_recues)));
    		//Envoi de la confirmation au client
    		byte[] donnees_envoyees = new byte[1024];
    		donnees_envoyees = new String("OK").getBytes();
    		System.out.println("Envoi des données : " + new String(donnees_envoyees));
    		flux_sortie.write(donnees_envoyees, 0, 1024);
    		System.out.println("Données envoyées : " + new String(donnees_envoyees));
    	}
    }
    Côté client :
    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
     
    class ClientTCPTest{
    	public static void main(String[] args) throws Exception{
    		//Creation de la socket client
    		Socket client_socket = new Socket("192.168.0.101", 5555);
    		//Création des flux E/S
    	        DataOutputStream flux_sortie = new DataOutputStream(client_socket.getOutputStream());
    		DataInputStream  flux_entree = new DataInputStream(client_socket.getInputStream()); 
    		//BufferedReader flux_entree = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
    		//Envoi du nom du fichier
    		byte[] donnees_envoyees = new byte[1024];
    		donnees_envoyees = new String("Salut\n").getBytes();
    		System.out.println("Envoi des données : " + new String(donnees_envoyees));
    		flux_sortie.write(donnees_envoyees, 0, 1024);
    		System.out.println("Données envoyées : " + new String(donnees_envoyees));
    		//Récupération de la réponse du serveur
    		byte[] donnees_recues = new byte[1024];
    		flux_entree.read(donnees_recues, 0, 1024);
    		System.out.println("Données reçues : " + new String(donnees_recues));
    	}
    }
    Mais c'est étrange car le serveur ne semble pas bien récupérer le tableau de bytes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $ java ClientTCPTest
    Envoi des données : Salut
    ---
    $ java ServerTCPTest
    Le serveur est en état de marche (0.0.0.0/0.0.0.0:5555).
    Un client souhaite envoyer un fichier...
    Données reçues :
    Vous voyez un truc que j'ai mal fait?

  4. #24
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    J'ai l'impression de me parler tout seul :-) mais bon ce n'est pas grâve.
    Les gros Topics ça doit effrayer.
    Finalement j'ai réussi.
    Il suffit d'utiliser la méthode read(byte[]) au lieu de read(byte[], int, int).
    Maintenant, un autre problème :
    Je n'arrive pas à écrire dans un fichier (voir mon code précédent).
    L'erreur qui apparaît :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $ java ServerTCPTest
    Le serveur est en état de marche (0.0.0.0/0.0.0.0:5555).
    Un client souhaite envoyer un fichier...
    Données reçues : Salut
     
    Exception in thread "main" java.io.FileNotFoundException: Salut
     (Invalid argument)
            at java.io.FileOutputStream.open(Native Method)
            at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
            at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
            at ServerTCPTest.main(ServerTCPTest.java:23)
    Normal que le fichier n'est pas trouvé puisque j'essaye de le créer... Pourquoi il me dit ça?

  5. #25
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    Déjà, je peux affirmer que la méthode est bien utilisée pour créer le fichier puisque si je remplace l'argument par "toto.txt" ça créé le fichier.
    Donc un problème avec ma String en argument...

  6. #26
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    Effectivement c'était la taille du byte[] que j'envoyais qui était fausse, donc la String après était mavaise lors de la conversion...Je termine l'application et si ça fonctionne je cloture enfin ce topic.

  7. #27
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    Là j'ai un problème lors de la lecture en binaire du fichier sur le client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //Calcul du nombre de caractères du fichier
    						try{
    	        					DataInputStream flux_lecture = new DataInputStream(new FileInputStream(path));
    						}
    						catch(FileNotFoundException ex){
    							System.err.println(ex);
    						}
    						//Récupère le premier octet
    						byte[] donnees_lues = new byte[1024];
    						System.out.println("+++");
    						int ret = flux_lecture.read(donnees_lues, 0, 1);
    Lors de l'execution du programme, j'obtiens :
    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
     
    +++
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
            at Depot$2.actionPerformed(Depot.java:136)
            at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1849)
            at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2169)
            at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
            at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
            at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
            at java.awt.Component.processMouseEvent(Component.java:5488)
            at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
            at java.awt.Component.processEvent(Component.java:5253)
            at java.awt.Container.processEvent(Container.java:1966)
            at java.awt.Component.dispatchEventImpl(Component.java:3955)
            at java.awt.Container.dispatchEventImpl(Container.java:2024)
            at java.awt.Component.dispatchEvent(Component.java:3803)
            at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
            at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3892)
            at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
            at java.awt.Container.dispatchEventImpl(Container.java:2010)
            at java.awt.Window.dispatchEventImpl(Window.java:1778)
            at java.awt.Component.dispatchEvent(Component.java:3803)
            at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
            at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
            at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
            at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
            at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
    Je ne comprends pas pourquoi...

  8. #28
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    lol tout simplement il y a un try{} et donc je n'ai pas pu acceder au contenu du flux de lecture... Je continue l'application...

  9. #29
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    C'est bon le programme fonctionne.
    Maintenant, j'esssaye de transférer plus d'un byte à la fois. Mais ça ne fonctionne pas.
    Voici mon tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    byte[] donnees_envoyees = new byte[1024];
    Donc je peux transférer jusqu'à 1024 octets. Le problème c'est que quand j'essaye de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    flux_lecture.read(donnees_envoyees, 0, 1024)
    Ca me dit que la taille du tableau est dépassée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException
    ...
    Normal parce que quand j'affiche sa taille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println(donnees_envoyees.length);
    Je n'obtiens pas une taille de 1024! En fait malgré que j'ai initialisé le tableau avec une taille de 1024, il ne considère pas que sa taille est de 1024 car le tableau n'est pas encore rempli de données...
    Quelle solution me conseillez vous?

  10. #30
    Membre régulier Avatar de YuGiOhJCJ
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2005
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2005
    Messages : 206
    Points : 114
    Points
    114
    Par défaut
    C'est bon ça fonctionne.
    Cela venait probablement de plus haut dans mon programme, ça modifiait la taille du tableau.
    Il m'a suffit de réinitialiser le tableau à 1024 en faisant 'new byte[1024]' et le tour est joué.
    Bon elle est bientôt prete cette application...Je laisse ce topic ouvert encore quelques temps au cas où j'aurai encore besoin d'aide.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/04/2008, 17h40
  2. Réponses: 3
    Dernier message: 11/03/2008, 01h14
  3. Réponses: 4
    Dernier message: 16/07/2007, 17h33
  4. Récupérer un fichier sur un serveur HTTP
    Par Medivh dans le forum WinDev
    Réponses: 2
    Dernier message: 01/04/2007, 22h28
  5. [VBA-E]Ouverture de fichier sur un serveur http
    Par Scritch852 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/03/2007, 12h17

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