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

Développement Web en Java Discussion :

[RMI] Envoie de fichier via Java


Sujet :

Développement Web en Java

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Points : 12
    Points
    12
    Par défaut [RMI] Envoie de fichier via Java
    Bonjour !!

    Je suis en train de développer une application client/serveur avec RMI qui va faire des calculs et donnera les résultats sous forme de fichier Microsoft Excel. Tout est fait, maintenant, il faut que j'envoie ses fichiers là de l'application serveur à l'application client et vice versa mais je n'est pas vraiment une idée sur le truc, est-ce c'est possible via RMI, ou bien il me faut une autre bibliothèque ?!

    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
    RMI est un système d'appel distant (ça visiblement t'as pas de soucis avec) qui sérialize les paramètres et la réponse. Donc si tu veux envoyer le résultat, ben tu le met par exemple dans un byte[] et tu envoie ce byte au client comme réponse.

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Bonsoir !

    Merci tchize_ pour cette réponse, c'est efficace, mais j'ai un autre problème maintenant, pour envoyer un fichier "Mircosoft Excel" ou bien "Microsoft Word" je trouve des problèmes, je n'ai pas trouvé comment rendre mes fichiers des objets sérialisables

    Est-ce qu'il y en a un moyen de le faire ?!!

    Merci d'avance pour votre aide.

  4. #4
    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
    Montre nous ton code et tes erreurs.

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    D'accord, voilà mon interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    import java.util.ArrayList;
     
    public interface RMI extends Remote{
        public String getData(ArrayList<byte[]> fichier, String nom) throws RemoteException;
    }
    Voilà mon 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
    47
     
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectOutputStream;
    import java.rmi.RemoteException;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.rmi.server.UnicastRemoteObject;
    import java.util.ArrayList;
    import java.util.logging.Level;
    import java.util.logging.Logger;
     
    public class RMIServer extends UnicastRemoteObject implements RMI{
     
        public RMIServer() throws RemoteException{
            super();
        }
     
     
        @Override
        public String getData(ArrayList<byte[]> list, String nom) throws RemoteException {
            try {
                ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File(nom))));
                for(int i=0; i<list.size(); i++){
                    oos.write(list.get(i));
                }
                oos.close();
            } catch (IOException ex) {
                Logger.getLogger(RMIServer.class.getName()).log(Level.SEVERE, null, ex);
                return "Non reçu";
            }
            return "Bien reçu";
        }
     
        public static void main(String args[]){
            try{
                Registry reg = LocateRegistry.createRegistry(1099);
                System.out.println(reg);
                reg.rebind("server", new RMIServer());
                System.out.println("Server started");
            }catch(Exception e){
                System.out.println(e);
            }
        }
    }
    et mon 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
    40
     
     
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.ObjectInputStream;
    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.util.ArrayList;
     
    public class RMIClient {
        public static void main(String args[]){
            RMIClient client = new RMIClient();
            client.connectServer();
        }
     
        private void connectServer() {
            try{
                Registry reg = LocateRegistry.getRegistry("127.0.0.1", 1099);
                RMI rmi = (RMI) reg.lookup("server");
                ArrayList<byte[]> list = new ArrayList<>();
                byte[] buf = new byte[8];
                File f = new File("test.txt");
                System.out.println("Client started");
                ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(f)));
                System.out.println("and here");
                while(ois.read(buf) >= 0){
                    list.add(buf);
                }
                for(int i=0; i<list.size(); i++){
                    System.out.println(list.get(i));
                }
                String text = rmi.getData(list, f.getName());
                System.out.println(text);
            }catch(Exception e){
                System.out.println(e);
     
            }
        }
    }
    et j'ai comme affichage du client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Client started
    java.io.StreamCorruptedException: invalid stream header: 6772616E
    J'ai cru que ça marchera pour les fichiers textes, mais c'est idem que les fichiers excels

    Avez vous une idée comment faire passer mon fichier au serveur ?

  6. #6
    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
    D'abord je t'ai dit d'utiliser un Tableau de byte: byte[], pas d'utiliser une ArrayList de tableaux de byte
    Ensuite, pourquoi tu joue avec un ObjectInputStream pour lire ton fichier? Ce fichier n'est clairement pas un fichier contenant des objets java sérialisé, donc ça ne peux pas marcher. Vire ça.
    Enfin pourquoi tu appelle ta méthode getData alors qu'elle fait manifestement de l'upload (elle envoie le contenu du fichier)? setData serait un nom plus approprié.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface RMI extends Remote{
        public String setData(byte[] contenu, String nom) throws RemoteException;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        @Override
        public String setData(byte[] contenu, String nom) throws RemoteException {
            try{
                Files.write(Paths.get(nom),contenu);
            } catch (IOException ex) {
                Logger.getLogger(RMIServer.class.getName()).log(Level.SEVERE, null, ex);
                return "Non reçu";
            }
            return "Bien reçu";
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
                System.out.println("Client started");
                byte[] contenu = Files.readAllBytes(Paths.get("test.txt"));
                String text = rmi.setData(contenu, "test123.txt");
                System.out.println(text);

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Merci tchize_ c'est impécable, à vrai dire je ne connais pas les méthodes du package nio bien comme il faut

    Pour le ArrayList c'est pour rassembler les portions du fichier en byte[8] ... c'est trop naïf, j'admais

    Pour le nom getData, puisque j'ai utilisé un exemple que j'ai trouvé, je n'ai pris la peine de le changer !!

    Merci tchize_ pour cette précieuse aide.

    Bonne nuit

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

Discussions similaires

  1. Envoi de fichiers via sendmail windows
    Par domiq44 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/12/2006, 09h40
  2. [RMI] envoi de fichier binaire
    Par _ky_ dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 11/08/2006, 15h26
  3. [SSH2] envoi de fichier via scp
    Par samjung dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 27/12/2005, 12h09
  4. Envoie d'email via java
    Par log2n dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 21/11/2005, 19h49
  5. envoie de fichiers via les formulaires
    Par fabogranqi dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 10/10/2004, 21h34

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