IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Applets Java Discussion :

Socket - ObjectInputStream / ObjectOutputStream : Me renvoie toujours le meme objet


Sujet :

Applets Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut Socket - ObjectInputStream / ObjectOutputStream : Me renvoie toujours le meme objet
    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 !

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    une instance donnée n'est jamais sérialisée deux fois dans un même ObjectOuptutStream. ObjectOutputStream (et son pendant input) garde une référence sur tous les objets dans le stream et si on lui demande de sérialiser deux fois le même, la deuxième fois il insère juste un référence au premier. C'est d uau contrat de cette classe
    Multiple references to a single object are encoded using a reference sharing mechanism so that graphs of objects can be restored to the same shape as when the original was written.
    Bref, si vous voulez envoyer deux fois l'objet, créez deux instances.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 8
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    une instance donnée n'est jamais sérialisée deux fois dans un même ObjectOuptutStream. ObjectOutputStream (et son pendant input) garde une référence sur tous les objets dans le stream et si on lui demande de sérialiser deux fois le même, la deuxième fois il insère juste un référence au premier. C'est d uau contrat de cette classe

    Bref, si vous voulez envoyer deux fois l'objet, créez deux instances.

    Bonjour, Je viens de trouver mon probleme.

    Dans ma methode envoyer (ServeurDialigue), je passais en argument (Message msg), or j'utilisais outMessage dans mon writeObjetc, c'est pourquoi je ne recuperais pas le bon objet !

    Cependant, Ce que vous dites m'intrigue, car j'utilise bel et bien le meme objet, et celui ci est bien reserialisez a chaque writeObject() ! Le probleme ne venait pas de la, et ce que vous dites me semble faux (dans mon cas tout du moins). Il n'est pas necessaire de
    creer a chaque fois une instance pour envoyer un objet !

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    vous appelez la méthode reset sur le objetoutputstream (ce que je n'avais pas vu). Son role est justement de remettre à 0 les états de sérialisation
    Reset will disregard the state of any objects already written to the stream. The state is reset to be the same as a new ObjectOutputStream. The current point in the stream is marked as reset so the corresponding ObjectInputStream will be reset at the same point. Objects previously written to the stream will not be refered to as already being in the stream. They will be written to the stream again.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. socket send renvoi toujours (-1)
    Par tkwebch dans le forum Réseau
    Réponses: 8
    Dernier message: 30/08/2006, 17h24
  2. isdigit() renvoie toujours 0
    Par gangsoleil dans le forum C
    Réponses: 30
    Dernier message: 07/08/2006, 13h42
  3. [MySQL] Mon SELECT COUNT me renvoie toujours 1
    Par diaboloche dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 11/07/2006, 11h53
  4. Réponses: 2
    Dernier message: 16/04/2005, 20h24
  5. GList ayant toujours la même valeur
    Par GLDavid dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 18/03/2005, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo