Afficher un objet reçu coté client
Fermé
Vit@l
Messages postés
28
Date d'inscription
dimanche 6 avril 2014
Statut
Membre
Dernière intervention
12 juin 2020
-
12 févr. 2020 à 19:02
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 13 févr. 2020 à 19:47
KX Messages postés 16668 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 17 mars 2023 - 13 févr. 2020 à 19:47
A voir également:
- Afficher un objet reçu coté client
- Ce programme est écrit en python. il construit un mot secret dans une variable mais il ne l'affiche pas. modifiez-le pour qu'il affiche le mot secret. exécutez-le. quel est ce mot secret ? ✓ - Forum Python
- Formate pour taxer client connexion ✓ - Forum Matériel informatique
- Formate pour taxer client 500€ - Forum Consommation et internet
- Vente objet occasion entre particulier - Guide
- Sms non reçu ✓ - Forum Mobile
2 réponses
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
13 févr. 2020 à 08:22
13 févr. 2020 à 08:22
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...
Vit@l
Messages postés
28
Date d'inscription
dimanche 6 avril 2014
Statut
Membre
Dernière intervention
12 juin 2020
4
Modifié le 13 févr. 2020 à 19:41
Modifié le 13 févr. 2020 à 19:41
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
KX
Messages postés
16668
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 mars 2023
3 005
Modifié le 13 févr. 2020 à 19:49
Modifié le 13 févr. 2020 à 19:49
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é.