Bonjour tout le monde, je vais essayer d'etre bref, j'essaie de faire un programme en Java de messagerie instantané qui ressemble a 80% a MSN,en utilisant les interface graphique Swing et AWT ainsi que les Socket TCP

mon niveau en Java est intermediaire(je dirrai pas debutant ni expert quand meme)
voila le plan de mon projet (je serai heureux de vos suggestion pour l'améliorer ) :

- Serveur

1 - a la connexion du Server,il affiche une fenetre JFrame qui contient une JList personalisé qui simule la liste des contacte, il se met en ecoute sur un port avec la ServerSocket.accept() avec un Thread pour lui permettre de faire autre chose que l'ecoute...
dès la connexion d'un Client, j'instancie une classe ServerClient dont les attributs sont (Socket :retourné avec accept() et String Pseudo envoyé par le client quand il s'est connecté) et fait deux chose :
Ajouter l'objet ServerClient a la JList du Server
Envoyer le nouveau Client Client connecté a tous les Socket des ServerClient se trouvant sur cette JList (afin d'informer les clients déjà connecté de la connexion d'un nouveau membre).

vu que le Serveur et le Client peuvent recevoir plusieurs données a un instant T, et ces données ont besoin d’être traité selon leur nature, j'ai jugé plus convenable de créer un Objet que je nommerai transmission qui contient deux attribut (String indicateur et Object donnée) , l'indicateur pour indiquer la nature de l'objet reçu afin de le traiter comme il se doit, et donnée ça peut être n'importe quoi (Vector, String, int, POJO), après des teste j'arrive un problème c'est que lors de la réception le Client n'est pas bloqué lors du "input.readObject()" et il continue sont chemin en boucle ce qui me génère pas mal d'Exception. Autre chose, j'aimerai gérer la fermeture des Socket lors de la déconnexion d'un client ou même du Serveur entier, pour plus d'information voila mon code teste , j'ai omis de mettre le projet principale avec les JFrame et tout car c'est beaucoup lourd (14 CLASS), j'ai crée un nouveau projet pour test :

Dans ce test le client est en ecoute permanante avec le Thread monOperation, le Serveur quant a lui il envoi deux objet, une chaine String, et un Vector, le Client reçoit les deux et les traite comme il se doit, CEPENDANT il doit se remettre en écoute encore mais c'est pas le cas, MERCI d'avance les gars

Class Client
Code Java :
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
 
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
 
public class Client {	
	public static void main(String[] args) throws Exception{
		Socket socket = new Socket("localhost",12345);
		// l'objet qur recevera les données
		Transmission t = null;		
		ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
		// le Thread qui s'occupe de la reception et traitement selon la nature
		monOperation Mo = new monOperation(input, t);		
	}
}
Class Serveur
Code Java :
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
 
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
import javax.swing.JOptionPane;
 
public class Serveur {	
	public static void main(String[] args)throws Exception{		
		ServerSocket serveur = new ServerSocket(12345);
		Socket socket = serveur.accept();
		ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());		
		// saisir une donnée quelconque
		String msg = JOptionPane.showInputDialog(null, "Ecrire votre Message : ");
		Transmission t = new Transmission("Message", msg);
		// envoyé la chaine saisi
		output.writeObject(t);
		output.flush();
		// creation d'un vector pr tester
		Vector x = new Vector();
		x.add("Bonjour");
		x.add(88);
 
		t = new Transmission("Tableau", x);	
		output.writeObject(t);		
		output.flush();		
		// je sais pas encore quand est ce que je dois fermer la Socket
	}
}
Class Transmission : l'objet a transmettre
Code Java :
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
 
import java.io.Serializable;
public class Transmission implements Serializable {
 
	private static final long serialVersionUID = 1L;
	private String indicateur;
	private Object Donnee;
	// Constructeur
	public Transmission(String i,Object d){	indicateur = i;	Donnee = d;	}
	// getter
	public String getIndicateur() {	return indicateur;}
	public Object getDonnee() {return Donnee;}
	// setter
	public void setIndicateur(String indicateur) {this.indicateur = indicateur;}
	public void setDonnee(Object donnee) {Donnee = donnee;}	
 
}
class monOperation : Thread de reception permanante
Code Java :
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
 
import java.io.ObjectInputStream;
import java.util.Vector;
 
 
public class monOperation extends Thread{
 
	private ObjectInputStream input;
	private Transmission transmission;
 
	public monOperation(ObjectInputStream i,Transmission t){
		input = i;
		transmission = t;
		start();
	}
 
	public void run(){
		try {
			// on recuper l'objet  (c'est là où ça se bloque pas !!)
			Transmission trans = (Transmission) input.readObject();
			String indicateur = "";
			// connaitre la nature de l'objet recu
			indicateur = trans.getIndicateur();
 
			if(indicateur.equals("Message")){
				// traitement pour Message
				String msg = (String) trans.getDonnee();
				System.out.println("Recu du Serveur : "+ msg);
 
			}else if(indicateur.equals("Tableau")){
				// traitement pour les tableau
				Vector x = (Vector) trans.getDonnee();
				System.out.println("Recu du Serveur : "+ x);
 
			}else{
				// traitement par defaut si on reconnait pas 
				System.out.println("Object non reconnu");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}		
			// pour assurer la repetition du Thread (si vous avez d'autre suggestion n'hesitez pas)
			new monOperation(input, transmission);
	}
 
 
}