Afficher un objet reçu coté client

Signaler
Messages postés
27
Date d'inscription
dimanche 6 avril 2014
Statut
Membre
Dernière intervention
20 février 2020
-
KX
Messages postés
16110
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
13 février 2020
-
Salut la grande famille, je reviens ici car je compte énormément sur votre aide.
Au fait je développe une application client-serveur sur eclipse et tout va bien. Le problème est que ; après exportation (en jar exécutable) de mon application client, une fois exécutée elle n'affiche pas les objets qu'elle reçoit au travers le réseau.
Je ne sais que dire: Est-ce les objets qui n'arrivent pas? ou est-ce simplement que ça ne peut pas afficher un objet!?
par ailleurs elle reçoit correctement et affiche les chaines de caractères qu'elle reçoit de la part du serveur.
Je suis à court d'idées, qu'il vous plaise de me dépanner

2 réponses

Messages postés
16110
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
13 février 2020
2 531
Bonjour,

En Java il y a des dizaines de manières de coder une application client-serveur.
Sans ton code ta question est bien trop imprécise pour pouvoir t'aider...
Messages postés
27
Date d'inscription
dimanche 6 avril 2014
Statut
Membre
Dernière intervention
20 février 2020
3
salut KX, j'aurais du penser à mettre du code. Au fait le client envoie une requête au serveur, celui-ci sérialise le résultat dans un JTable puis le désérialise, et enfin l'envoi au client qui ne fait qui ne fait qu'un casting (en JTable) de l'objet reçu puis l'affiche dans un JPanel. voici mes codes:

côté serveur:

//Classe réception des messages et des requêtes

class ReceptionMessage extends Thread {
    ExecutionRequete exereq;
    Communication commu;
    ObjectInputStream ois;
    ObjectOutputStream oos;
    Object str = new Object();
    String messageRecu = "", st = "";
    int numeroClient;
    boolean message = false, requete = false;

    ReceptionMessage(Communication com, int numeroclient) {
        this.commu = com;
        this.numeroClient = numeroclient;
        this.ois = commu.ois;
        this.oos = commu.oos;
        compteurClient++;
        setNomFichierResultat("Client" + compteurClient);
    }

    public void run() {
        while (true) {
            try {
                try {
                    str = (Object) ois.readObject();
                    if (str.toString().startsWith("\tvitdmsg")) {
                        message = true;
                        requete = false;
                    }
                    if (str.toString().startsWith("\tvitdreq")) {
                        message = false;
                        requete = true;
                    }
                    if (message) {// Construction du message
                        st = str.toString() + "\n";
                        messageRecu += st;
                    }
                    if (str.toString().endsWith("\tvitfmsg")) {// si le message est entièrement reçu
                        messageRecu = messageRecu.substring(8, messageRecu.length() - 8);
                        panChat.add(new BlocChat("Client-" + numeroClient, messageRecu));
                        panChat.revalidate();
                        messageRecu = "";
                        message = false;
                    }
                    if (requete) {// Si c'est une requête, on la construit

                        if (accesBDD) {
                            st = str.toString();
                            messageRecu = st.substring(8, st.length());
                            exereq = new ExecutionRequete(messageRecu);
                            exereq.start();
                            while (!exereq.resSerialPret)
                                System.out.println("Téléchargement en cours ...");
                            System.out.println("Téléchargement terminé!");
// afficherResultatRequete(getNomFichierResultat());
                            oos.writeObject(tabResSerial);
                            oos.flush();

                            messageRecu = "";
                            requete = false;
                            exereq.resSerialPret = false;
                        }
                    }

                } catch (java.net.SocketException e) {
                    System.out.println("Auto-déconnexion brusque du client " + numeroClient);
                    conteneurBloc.remove(tabBlocClient[numeroClient - 1]);
                    panBtnClient.revalidate();
                    ois.close();

                    break;
                }

            } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }
}

classe qui traite les requêtes reçues
//Classe d'exécution des requêtes

class ExecutionRequete extends Thread {
    private String requete = "";
    private ResultSet resultat;
    ObjectOutputStream oosSerial;

    private int ligne = 0, colonne = 0;
    private JTable tableResultat;
    boolean resSerialPret = false;

    ExecutionRequete(String req) {
        this.requete = req;

    }

    public synchronized void run() {

        try {
            try {
                resultat = stm.executeQuery(requete);
                while (resultat.next())
                    ligne++; // on renseigne le nombre de lignes
                resultat = stm.executeQuery(requete);
                genererResultat(resultat);

            } catch (com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException e) {
                System.out.println("Connexion à la base des données non admise");
            }
// afficherResultat(resultat);
        } catch (SQLException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

//Méthode de construction du tableau des résultats
    protected void genererResultat(ResultSet result) {

        String[] tabTitre;
        String[][] tabDonnees;

        try {
            colonne = result.getMetaData().getColumnCount();// on renseigne le nombre de colonnes
            System.out.println("Nombre de colonnes: " + colonne);
            tabTitre = new String[colonne];
            for (int i = 1; i <= colonne; i++) {// Remplissage du tableau des titres
                tabTitre[i - 1] = result.getMetaData().getColumnName(i);
            }
            System.out.println("nombre de lignes trouvé: " + ligne);
            tabDonnees = new String[ligne][colonne];
//Remplissage des données
            int l = 0;
            while (result.next()) {
                for (int k = 1; k <= colonne; k++) {
                    tabDonnees[l][k - 1] = result.getString(k);
                }
                l++;
            }
//remplissage du JTable
            this.tableResultat = new JTable(tabDonnees, tabTitre);
//Sérialisation et désérialisation
            try {
                this.oosSerial = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File("ResReq/" + nomFichierResultat))));
                oosSerial.writeObject(tableResultat);
                oosSerial.close();
                ObjectInputStream oisSerial = new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File("ResReq/" + nomFichierResultat))));
                try {
                    tabResSerial = (JTable) oisSerial.readObject();
                    resSerialPret = true;
                } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }

        } catch (SQLException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

//Méthode qui renvoi le résultat sérialisé
    public JTable getResultat() {
        return tabResSerial;
    }

// Méthode d'affichage du tableau des résultats
    void afficherResultatConsole(ResultSet result) {

        try {
            while (result.next()) {
                for (int i = 1; i <= result.getMetaData().getColumnCount(); i++) {
                    System.out.print(result.getString(i) + "\t|");
                }
                System.out.println("\n-----------------------------------------");
            }
        } catch (SQLException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

coté client
Classe de réception d'objets et chaines de caractères
class ReceptionMessage extends Thread {

    Object str = new Object(), objetRecu = new Object();
    String messageRecu = "", st = "";
    boolean message = false, objet = false;

    public void run() {
        while (true) {
            try {
                try {
                    try {
                        str = (Object) ois.readObject();
                    } catch (java.net.SocketException e) {// Lorsque on ferme la fenêtre du serveur sans déconnexion des clients
                        System.out.println("Fermeture brusque du serveur");
                        ois.close();
                        break;
                    }
                } catch (java.io.EOFException e) {// Déconnexion à partir du serveur
                    labBienvenue.setText("Déconnexion à partir du serveur");
                    ois.close();
                    break;
                }
                try {// Portion de vérification du type
                    if (str.toString().startsWith("\tvitdmsg")) {// vérification du type
                        message = true;// c'est un message
                        objet = false;// c'est le résultat d'une requête
                    }
                } catch (NullPointerException e) {// C'est un objet
                    objet = true;
                }
                if (message) { // Si c'est un message, construction du message
                    st = str.toString() + "\n";
                    messageRecu += st;
                }
                if (message == false)
                    objet = true;
                try {
                    if (str.toString().endsWith("\tvitfmsg")) {// On affiche le message une fois reçu entièrement
                        messageRecu = messageRecu.substring(8, messageRecu.length() - 8);
                        conteneurBloc.add(new BlocChatReception(messageRecu));
                        jspConteneurBloc.revalidate();
                        System.out.println("Réception du message:" + str.toString());
                        messageRecu = "";
                        message = false;

                    }
                } catch (NullPointerException e) {
                    objet = true;
                }
                if (objet) {// si c'est un objet; lecture de l'objet
                    System.out.println("C'est un objet");// On fait aussi sa lecture
                    objet = false;
                    afficherResultat(str);
                    panCentral.revalidate();
                }

            } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    private void afficherResultat(Object tabres) {
        JTable tabResSerial = new JTable();
        try {
            ObjectOutputStream oosSerial = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(new File("ResReq"))));
            oosSerial.writeObject(tabres);
            oosSerial.close();
            System.out.println("Fin de sérialisation");
            ObjectInputStream oisSerial = new ObjectInputStream(new BufferedInputStream(new FileInputStream(new File("ResReq"))));
            try {
                tabResSerial = (JTable) oisSerial.readObject();
                oisSerial.close();
            } catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        }
        panResultat.removeAll();
        panResultat.add(new JScrollPane(tabResSerial));

        System.out.println("C'est fait!");

    }
}

et enfin la classe qui envoie les requêtes
class MesRequetesListener implements ActionListener {
    String requete = "";

    public void actionPerformed(ActionEvent arg0) {
        if (arg0.getSource().equals(btnRechNumPlaque)) {
            requete = "\tvitdreqSELECT * FROM Eleve";// On donne une valeur à la requête
            System.out.println(requete);
        }
        try {
            try {
                oos.writeObject(requete);
                oos.flush();
                requete = "";
            } catch (java.net.SocketException e) {// Lorsqu'on n'est pas connecté
                labBienvenue.setText("Vous n'êtes pas connecté");
            }
        } catch (IOException e) {
// TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Voilà, c'est fait. Comme annoncé dans mon premier message, les deux applications fonctionnent bien n'étant pas encore exportées. après exportation du client en jar exécutable aucun affichage de tableau, aucune erreur non plus... c'est dur de savoir par où commencer. Merci encore de bien vouloir m'assister
KX
Messages postés
16110
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
13 février 2020
2 531
Pour commencer, démarres tes applications depuis une console, cela permettra de voir s'afficher tous les messages (System.out et System.err) qui t'aideront à savoir ce qui se passe (et si besoin tu peux en rajouter...)
Commande de démarrage :
java -jar MonFichier.jar


Si vraiment tu vois que le programme "bloque", tu peux utiliser la commande
jps
qui affichera la liste des programmes Java démarrés et leurs identifiants (par exemple 1234).
Grâce à cet identifiant tu peux utiliser
jstack 1234
qui affichera la stack de tous les threads en cours, pour voir sur quelles lignes le programme est bloqué.