Afficher un objet reçu coté client
Vit@l
Messages postés
32
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
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
- Numéro service client orange - Guide
- Pourquoi mon casque bluetooth ne marche que d'un coté ✓ - Forum Casque et écouteurs
- Bouygues service client - 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é.