Afficher un objet reçu coté client
Vit@l
Messages postés
28
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
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
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
A voir également:
- Afficher un objet reçu coté client
- Cybera client - Télécharger - Divers Réseau & Wi-Fi
- Filezilla client - Télécharger - Téléchargement & Transfert
- Afficher appdata - Guide
- Pourquoi mon casque bluetooth ne marche que d'un coté ✓ - Forum Casque et écouteurs
- Vente objet occasion entre particulier - Guide
2 réponses
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...
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...
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 qui traite les requêtes reçues
coté client
Classe de réception d'objets et chaines de caractères
et enfin la classe qui envoie les requêtes
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
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
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 :
Si vraiment tu vois que le programme "bloque", tu peux utiliser la commande
Grâce à cet identifiant tu peux utiliser
Commande de démarrage :
java -jar MonFichier.jar
Si vraiment tu vois que le programme "bloque", tu peux utiliser la commande
jpsqui affichera la liste des programmes Java démarrés et leurs identifiants (par exemple 1234).
Grâce à cet identifiant tu peux utiliser
jstack 1234qui affichera la stack de tous les threads en cours, pour voir sur quelles lignes le programme est bloqué.