Bonjour à tous,

Je ne sais pas vraiment ou poster ce sujet donc je le met la...
Je suis sur un exercice de java en client/serveur. Le but est de faire communiquer des petit client telnet 2 à 2. Le client 1 et 2 se connecte et peuvent s'envoyer des messages via un serveur echo, le client 3 et les suivants attendent leur tour.... sachant que le client 3 ne peut discuter qu'avec le 4, le 5 avec le 6, etc... (la déconnexion du 1 entrainant celle du 2, ais).
Voila ce que j'ai fait pour l'instant, cela marche mais jpense pas que ce soit très optimisé...

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
 
	public ServerLaboulaisMartin() throws IOException
	{    
		serveurSock = new ServerSocket(port);	//initialisation du serveur sur le port indiqué
		listAuditeur = new ArrayList();	//initialisation de la liste des auditeurs
		SaisieSpeaker speaker = new SaisieSpeaker();	//initialisation de la classe saisieSpeaker
		speaker.start();
	}
 
	public void go() throws IOException
	{
		for(;;)
		{
			Socket socket = serveurSock.accept();	//récupération du socket de l'auditeur
			System.out.println("connection de : "+socket);
			synchronized(listAuditeur)
			{
				listAuditeur.add(new Auditeur(socket));//ajoute l'auditeur à la liste auditeur
			}
		}
	}
 
	private class SaisieSpeaker extends Thread
	{
		public void run()
		{
			ArrayList<Auditeur> cloneList = null;	// création d'une deuxieme liste
			byte[] buffer = new byte[1024];	
			OutputStream sockOut = null;
			while (true)
			{     
				synchronized(listAuditeur)
				{
					cloneList=(ArrayList<Auditeur>)listAuditeur.clone();			
 
				}
 
 
 
 
 
				Iterator<Auditeur> ite= cloneList.iterator();
				int y=0;
				while (ite.hasNext()&&y<2)
				{
					Auditeur audi2 = ite.next();
					try
					{
						BufferedReader sockIn = new BufferedReader(new InputStreamReader(audi2.getSocket().getInputStream()));
						if(sockIn.ready() == true)	//si un client envoie un message
						{
						String recu = sockIn.readLine();	//lecture du message
 
							System.out.println(recu);
							recu =""+ audi2.getSocket()+"envoie : "+recu+"\n";
 
							Iterator<Auditeur> auditeur2= cloneList.iterator();
							int i =0;
							while (auditeur2.hasNext()&&i<2)	//parcours de l'ensemble de la liste des auditeurs
							{
 
								//envoie du message à tous les clients
								Auditeur audi = auditeur2.next();	
 
								try
								{
 
									buffer = recu.getBytes();
									sockOut = audi.getSockOut();
									sockOut.write(buffer, 0, recu.length());
									sockOut.flush();
 
								}
								catch (IOException e)
								{
									synchronized(listAuditeur)
									{
										System.out.println("voila l'info "+listAuditeur.indexOf(audi));	
 
										System.out.println(audi.getSocket() + "vient de quitter la conversation");
										if (listAuditeur.indexOf(audi)==0)
										{
										System.out.println("rentré dans le if");
										audi.getSocket().close();
										listAuditeur.remove(listAuditeur.get(1));
 
										}
										else if (listAuditeur.indexOf(audi)==1)
										{
										System.out.println("rentré dans le if 2");
										audi.getSocket().close();
										listAuditeur.remove(listAuditeur.get(0));
 
										}
										listAuditeur.remove(audi);	// suppression du client déconnecté
										System.out.println("voila l'info "+listAuditeur.indexOf(audi));	
 
 
					   				}
								}
 
							i++;	
							}
						}		
 
					}
					catch (IOException e)
					{
 
					}y++;
				}   
			}  
		}  
	}
}
Si qqun a une idée pour optimiser ça ou un autre moyen de faire, je suis preneur!

Merci