Bonsoir/Bonjour a tous !

Bon, voila je me lance, après avoir deseperement chercher sur internet pourquoi readObject() me retourne toujours le meme objet, je me tourne vers vous pour que vous puissiez m'aider !

Tout cela ce passe dans le cadre d'un devellopement d'un chat Serveur/client (Client qui est un applet)

Voila mon serveur (Tout marche tres bien jusque la)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
 
import java.net.ServerSocket;
import java.util.ArrayList;
import java.io.*;
public class Serveur {
	static int port;
	private static ArrayList clients;
	private static ServerSocket serveur;
 
	public static void main(String args[]) {
		//Ce serveur prend un no de port en argument. On commence par vérifier l'argument
		if(args.length != 1) {
			System.out.println("le Serveur prend un et un seul argument : le no de port d'ecoute (qui doit etre compris entre 1024 et 65535)");
			System.exit(1);
		}
		try {
			port = Integer.parseInt(args[0]);
		} catch(Exception e) {
			System.out.println("erreur : l'argument passe n'est pas un nombre entier");
			System.exit(1);
		}
		if(port < 1024 || port > 65535) {
			System.out.println("erreur : le no de port doit etre compris entre 1024 et 65535");
			System.exit(1);
		}
 
		//création de la socket d'écoute
		try {
			serveur = new ServerSocket(port);
		} catch (Exception e) {
			System.out.println("erreur a la creation de la socket d'ecoute : "+e.getMessage());
			System.exit(1);
		}
		System.out.println("Serveur demarre");
 
		//écoute des demandes de connexion des clients
		clients = new ArrayList();
		try{
			for (;;){
				clients.add(new ServeurDialogue(serveur.accept())); // création d'une instance de ServeurDialogue pour chaque client
				System.out.println("Client connecte");
			}
		} catch (Exception e) {
			System.out.println("erreur lors de la connexion d'un client : "+e.getMessage());
			System.exit(1);
		}
	}
 
	public static void envoyer(Message msg){//cette fonction envoie un message à tous les clients
 
		System.out.println("SERVER ALL - UserEnterChat - type: " + msg.type + " message: " + msg.message +" valeur: " + msg.value);
		for(int i = 0; i < clients.size(); i++)
		{
			((ServeurDialogue)clients.get(i)).envoyer(msg);
		}
	}
 
	public static boolean isLogged(String login){
 
		boolean  existe = false;
		for(int i = 0; i < clients.size(); i++)
		{
			if(((ServeurDialogue)clients.get(i)).login.equals(login)){
				existe = true;
			}
		}		
		return existe;
	}
 
	public static void retirerClient(ServeurDialogue serveurDialogue){
		for(int i = 0; i < clients.size(); i++)
		{
			if((ServeurDialogue)clients.get(i) == serveurDialogue)
			{
				clients.remove(i);
				break;
			}
		}
	}
 
}

Quand mon serveur accepte un nouveau client, on instancie un objet de type ServeurDialogue qui se transforme en thread (Objet qui gere la communication avec un client attitré)

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
 
/*
* La classe Serveur crée 1 instance de cette classe par client qui se connecte. ServeurDialogue gère
* toutes les communications avec son client attitré. Juste après sa création, il se transforme en thread
* pour que les autres instances de ServeurDialogue puissent travailler en même temps.
*/
 
import java.net.Socket;
import java.net.ServerSocket;
import java.io.DataInputStream;
import java.io.PrintStream;
import java.io.IOException;
import java.lang.Object;
 
/* -----------------------------
Import pour effectuer les communication entre les Serveur et le Client
----------------------------- */
 
import java.io.InputStream;
import java.io.OutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
 
 
/* -----------------------------
Class qui sert d'intermediaire entre le Serveur et son client attitré - 
Cette classe se transforme en thread
----------------------------- */
 
class ServeurDialogue implements Runnable {
 
//Attributs 
/* -----------------------------
Communication
----------------------------- */
	Socket client;
	Message outMessage; 
	Message inMessage; 
	OutputStream output; 
	InputStream input;
	ObjectOutputStream out;           
	ObjectInputStream in ;
 
/* -----------------------------
Gestion
----------------------------- */
	boolean connected;
	int somme = 0;
	public String login;
	//PartieChat partie;
 
 
//------------ Constructor
	public ServeurDialogue(Socket client) {
		this.client = client;
		this.connected = true;
		this.login = "";
		this.outMessage = new Message("","","");
		try{
			this.output = client.getOutputStream();
			this.input = client.getInputStream();
 
		}catch(IOException e) {
			System.out.println("Erreur lors de la création des flux : " + e.getMessage());
		}
 
		//on transforme cette instance en thread => appel de la fonction run().
		new Thread(this).start();
	}
 
 
//------------ Methode lancée une fois le thread lancé (start())
	public void run() {
 
		try {			
			System.out.println("Lancement run()");	
 
			ObjectInputStream in = new ObjectInputStream(this.input);
			this.in = new ObjectInputStream(this.input);
			ObjectOutputStream out = new ObjectOutputStream(this.output);    
			this.out = new ObjectOutputStream(this.output); 
			out.flush();
 
			while (connected) {
				try{			
					out.flush();
					System.out.println("Attente message");				
					inMessage = (Message)in.readObject();
					traitementMessage();
					inMessage = null;
 
 
				}
				catch(IOException e) {
					System.out.println("run() try : ClassNotFoundException: " + e.getMessage());
					this.connected = false;
					client.close(); 
				}
			}
 
		}catch(java.lang.ClassNotFoundException e) {
			System.out.println("quoi ici ? ClassNotFoundException: ");
		}catch(IOException e) {
			System.out.println("run() : ClassNotFoundException: " + e.getMessage());
			try { 
				client.close(); 
			} catch (IOException ee) {
				//todo Exception
			}
		}	
		System.out.println("Fin run");
	}
 
 
//------------ Traitement des message
	public void traitementMessage(){
		if(inMessage.type.equals("login")){
			if(inMessage.message.equals("new")){ //Si on essaie de se connecter
				connexionChat();
			}
 
 
		}
 
 
 
	}
//--------------------------- Fin traitementMessage()
 
//------------ Tentative de connexion au chat
	public void connexionChat(){	
 
		outMessage.type = "login";
		outMessage.message = "new";			
		if(Serveur.isLogged(inMessage.value)){ 			
			outMessage.value = "already_used";				
		}else{
			this.login = inMessage.value;
			outMessage.value = "succes";
		}
 
		try{
			System.out.println("Reponse connexion");
 
			out.writeObject(outMessage); //Envoi du message au client
			out.flush();
			out.reset();
 
			if(outMessage.value.equals("succes")){
				//Le serveur envoi un message a tout les utilisateur
				outMessage.type = "user";
				outMessage.message = "enter";
				outMessage.value = this.login;
				Serveur.envoyer(outMessage);
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	} 
//--------------------------- Fin connexionChat()
 
 
 
	public void envoyer(Message msg) {	
		try{	
			System.out.println("Envoi a " + login);					
			this.out.writeObject(outMessage); //Envoi du message au client
			this.out.flush();
			this.out.reset();
 
		}catch(IOException e){
			e.printStackTrace();
		}
	}
 
	public void stop() {
		try {
			//Serveur.envoyer("general:" + login + " est parti du chat");
			Serveur.retirerClient(this);
			client.close();
		} catch (IOException e) {
			System.out.println("exception a la fermeture d'une connexion : "+e);
		}
	}
 
}

Enfin, Voila ma classe 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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
 
/*
* Cette applet est le client du chat. Elle commence par initialiser ses composants graphiques (fonction init),
* puis la fonction start lance cette classe en thread, ce qui declenche la methode run. 
* Je ne sais pas si c'etait vraiment utile dans notre cas d'utiliser un thread, mais ca peut l'etre dans d'autres cas
* lorsqu'on veut effectuer plusieurs taches en parallele. Bref, la methode run se connecte au serveur
* puis se met a son ecoute. A chaque fois que le serveur envoie un message, elle regarde la premiere partie
* de ce message (qui indique le type de message), et ecrit la 2e partie du message dans la JTextPane avec des styles
* d'ecriture differents selon le type du message.
* Les autres fonctions servent a reagir aux evenements, notamment dans le cas ou l'utilisateur veut envoyer
* un message sur le chat.
*/
import javax.swing.JPanel;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import java.awt.Container;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.io.PrintStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.*;
import java.io.InputStream;
import java.io.OutputStream;
 
public class Client extends JApplet implements Runnable, ActionListener, KeyListener {
	//attributs panneau de login
	JPanel panelLogin;
	JTextField textFieldLogin;
	JButton buttonLogin;
	JLabel labelLogin;  
 
	//attributs panneau de chat
	JPanel panelChat;
	JTextPane textPaneChat;
	JTextPane textPaneUser;
	JTextField textFieldChat;
	JButton buttonChat;
	JLabel labelChat;
	JLabel labelUser;
	JScrollPane scrollChat; 
	JScrollPane scrollUser; 
 
//Attributs 
/* -----------------------------
Communication
----------------------------- */
	public OutputStream output;
	public InputStream input;
	String ipServeur;
	int portServeur;
	Socket sk;
	BufferedReader depuisServeur;
	PrintStream versServeur;
	public ObjectOutputStream out;           
	public ObjectInputStream in;
 
 
	//autres attributs
	Thread thread;
	Container cp;
	Message outMessage;
	Message inMessage;
	boolean connected;
 
	PartieChat partie;
 
 
	public void init() {
		//Initialisation
		partie = null;
		connected = true;
		inMessage = new Message("","","");
		outMessage = new Message("","","");
 
		ipServeur = getParameter("ipServeur"); //on recupere un parametre precise dans la page html
		portServeur = Integer.parseInt(getParameter("portServeur")); //on recupere un autre parametre de la page html
		cp = getContentPane(); //on recupere le panneau de l'applet
		cp.setLayout(null); //On desactive la mise en forme du panneau principal, pour positionner les objets via des coordonnees
 
		//attributs pour le panneau de login
		panelLogin = new JPanel(); //panneau de login
		panelLogin.setLayout(null);
		panelLogin.setBounds(0,0,750,420); //on lui donne la taille totale de l'applet
		panelLogin.setBackground(new Color(213,232,251));
		cp.add(panelLogin);
		labelLogin = new JLabel("Entrez un identifiant :");
		labelLogin.setBounds(165,180,140,20);
		panelLogin.add(labelLogin);
		textFieldLogin = new JTextField(30);
		textFieldLogin.setBounds(290,180,200,20);
		textFieldLogin.addKeyListener(this);//pour reperer les frappes de touches du clavier quand le focus est sur textFieldLogin
		panelLogin.add(textFieldLogin);
		buttonLogin = new JButton("Entrer");
		buttonLogin.setBounds(500,180,90,20);
		buttonLogin.addActionListener(this);//pour reperer les evenements lies a buttonLogin
		buttonLogin.addKeyListener(this);//pour reperer les frappes de touches du clavier quand le focus est sur buttonLogin
		panelLogin.add(buttonLogin);
 
		//attributs pour le panneau de chat
		panelChat = new JPanel();//panneau de chat
		panelChat.setLayout(null);
		panelChat.setBounds(0,0,750,420);//on lui donne la taille totale de l'applet
		panelChat.setBackground(new Color(213,232,251));
		panelChat.setVisible(false);
		cp.add(panelChat);
		textPaneChat = new JTextPane();
		textPaneChat.setEditable(false);
 
		labelUser = new JLabel("Util :");
		labelUser.setBounds(550,10,190,10);
		panelChat.add(labelUser);
 
		scrollUser = new JScrollPane(textPaneUser);
		scrollUser.setBounds(550,25,190,355);
		scrollUser.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		panelChat.add(scrollUser);
 
 
		scrollChat = new JScrollPane(textPaneChat);
		scrollChat.setBounds(10,10,530,370);
		scrollChat.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		panelChat.add(scrollChat);
		labelChat = new JLabel("Message :");
		labelChat.setBounds(10,390,60,20);
		panelChat.add(labelChat);
		textFieldChat = new JTextField(30);
		textFieldChat.setBounds(75,390,565,20);
		textFieldChat.addKeyListener(this);//pour reperer les frappes de touches du clavier quand le focus est sur textFieldChat
		panelChat.add(textFieldChat);
		buttonChat = new JButton("Envoyer");
		buttonChat.setBounds(650,390,90,20);
		buttonChat.addActionListener(this);//pour reperer les evenements lies a buttonChat
		buttonChat.addKeyListener(this);//pour reperer les frappes de touches du clavier quand le focus est sur buttonChat
		panelChat.add(buttonChat);
	}
 
	public void start() {
		if (thread == null) {
			thread = new Thread(this);
			thread.start();
		}
	}
 
	public void stop() {
	}
 
	public void run() {
		try {
			connexion();//connexion au serveur de chat
			DefaultStyledDocument docPane = (DefaultStyledDocument)textPaneChat.getDocument();
			Style normal = textPaneChat.addStyle("normal", textPaneChat.getLogicalStyle());
			Style gras = textPaneChat.addStyle("gras", textPaneChat.getLogicalStyle());
			StyleConstants.setBold(gras, true);
			Style italique = textPaneChat.addStyle("italique", textPaneChat.getLogicalStyle());
			StyleConstants.setItalic(italique, true);
			String line;
 
			this.output = sk.getOutputStream();
			this.input = sk.getInputStream();
			//Création des flux de sortie			
			ObjectOutputStream out = new ObjectOutputStream(this.output);    
			this.out = new ObjectOutputStream(this.output);	
			out.flush();	
			//Création des flux d'entree
			ObjectInputStream in = new ObjectInputStream(this.input);
			this.in = new ObjectInputStream(this.input);
 
			//Tant qu'on est connecte
			while (connected) { 
				//Reception des Message en boucle
				inMessage = (Message)in.readObject();
				System.out.println("run - type: " + inMessage.type + " message: " + inMessage.message +" valeur: " + inMessage.value);
				traitementMessage();	
				inMessage = null;
				out.reset();
 
			}
 
		} catch (Exception e) {
			System.out.println("erreur run : " + e.getMessage());
			e.printStackTrace();
		} finally {
			disconnect();
		}
	}
 
	public void actionPerformed(ActionEvent evt) 
	// Permet de traiter un evenement en fonction de l'objet source
	{  
		Object source = evt.getSource(); 
		if (source == buttonLogin){
			login();
		}else if (source == buttonChat){
			sendText();
		}
	} 
 
	public void keyPressed(KeyEvent evt){
	//cette fonction ne nous sert pas, mais on est oblige de l'ecrire car notre classe implemente l'interface KeyListener
	}
 
	public void keyReleased(KeyEvent evt){
	//cette fonction ne nous sert pas, mais on est oblige de l'ecrire car notre classe implemente l'interface KeyListener
	}  
 
	public void keyTyped(KeyEvent evt) { //quand on appuie sur une touche...
		Object source = evt.getSource();
		if(source==buttonLogin && evt.getKeyChar() == '\n')
			login();
		else if(source==textFieldLogin && evt.getKeyChar() == '\n')
			login();
		else if(source==textFieldChat && evt.getKeyChar() == '\n')
			sendText();
		else if(source==buttonChat && evt.getKeyChar() == '\n')
			sendText();
	} 
 
	public void sendText() { //envoi d'un message au serveur
		if (textFieldChat.getText().equals("")) {
			showStatus("Vous devez entrer un message");
			return;
		} else if(textFieldChat.getText().length() > 10000) {
			showStatus("Texte trop long");
			return;
		} else {
			versServeur.println("message:" + textFieldChat.getText());
			textFieldChat.setText("");
		}
	}
 
public void login(){ //pour s'identifier sur le serveur
	if (textFieldLogin.getText().equals("")) {
		showStatus("Vous devez entrer un identifiant");
	}else {
		//Message a envoyer au serveur
		outMessage.value = textFieldLogin.getText();
		outMessage.type = "login";
		outMessage.message = "new";
		try{
			out.writeObject(outMessage);	
			out.flush();
			out.reset();					
 
		}catch (IOException e) {
			System.out.println("login () : ClassNotFoundException: " + e.getMessage());
			e.printStackTrace();
		}						
	}
}
//--------------------------- Fin login()
 
 
public void connexion(){ //pour se connecter au SocketServeur
	try{
		sk = new Socket(ipServeur,portServeur); //connexion au serveur via une socket
	}catch(IOException e){
		System.out.println("erreur connect : " + e.getMessage());
	}	
}
//--------------------------- Fin connexion()
 
public void disconnect() { //pour se deconnecter du serveur
	try {
		sk.close();
	} catch (Exception e) {
		System.out.println("erreur disconnect : " + e.getMessage());
	}
}
//--------------------------- Fin disconnect()
 
 
public void traitementMessage(){
 
	if(inMessage.type.equals("login")){
		if(inMessage.message.equals("new")){ //Si on essaie de se connecter
			connexionChat();
		}		
	}
 
	if(inMessage.type.equals("user")){
		if(inMessage.message.equals("enter")){ //Si on essaie de se connecter
			UserEnterChat();
		}		
	}
 
 
}
 
 
public void connexionChat(){
 
	if(inMessage.value.equals("already_used")){
		System.out.println("vous etes deja connecte");
	}else{
		panelLogin.setVisible(false);
		panelChat.setVisible(true);
		textFieldChat.requestFocus();	
	}
}//---------- Fin connexionChat()
 
public void UserEnterChat(){
	try {
		System.out.println(" - FROM SERVER - type: " + inMessage.type + " message: " + inMessage.message +" valeur: " + inMessage.value);
		String log = inMessage.value;
		DefaultStyledDocument docPane = (DefaultStyledDocument)textPaneChat.getDocument();
		Style italique = textPaneChat.addStyle("italique", textPaneChat.getLogicalStyle());
		docPane.insertString(textPaneChat.getDocument().getLength(),log + " entre sur le chat" + "\n", italique);
		textPaneChat.setCaretPosition(textPaneChat.getDocument().getLength()); //pour mettre le curseur tout en bas du textPaneChat
		textPaneChat.requestFocus();//pour que le textPaneChat aille jusqu'au curseur, cad tout en bas
		textFieldChat.requestFocus();//pour redonner la main au textFieldChat
	} catch (Exception e) {
		System.out.println("erreur UserEnterChat : " + e.getMessage());
		e.printStackTrace();
	}
}//---------- Fin UserEnterChat()
 
 
 
 
 
}//---------- Fin classe

Pour info, tout ce qui est "graphique sera gerer par la suite par des classes, ici c'est pour tester!

Enfin, ma classe message implemente Serializable, donc la serialisation de mon objet de Type Message ne pose ici aucun soucis.


Pour resumé mon probleme,

- Je lance mon serveur sur le port 15000.
- J'attend qu'un client se connecte -> j'instancie un objet de type serveurDialogue.
- J'envoi un message au serveur avec mon pseudo >
- Le serveur verifie s'il éxiste deja
- S'il éxiste déjà, le client renvoit un message (La, le nouveau message est bien recu !!!!! Donc le serveur ne recoit pas le meme message, mais bien un nouveau avec un nouveau login pour se connecter)
- Ensuite des qu'il se connecte, le serveur envoi un message a tout les clients, Et c'est bien ici que ca coince, Les clients recoivent bien un flux, et l'intercepte, mais l'objet recuperer n'est pas le bon...

J'ai essayé avec flush(), reset() mais rien n'y fait,

Avez vous des idées ? aidez moi, je vous en conjure !!

PS : Je code en java que depuis 3 semaines, mais les notions de flux, threads, ect... sont maitrisées !