Bonjour,
je débute le Java depuis maintenant 1 semaine.
J'essai de faire un petit serveur de chat utilisant des sockets.
J'ai donc parcouru des sites, des tutoriaux, en particulier Développement d'un serveur Java multi-thread simple
Apres quelques modif perso ca semble fonctionner plutot bien, mais voila je me suis rendu compte que les thread clients sont crées à chaque message envoyé, ce qui me semble assez génant.

je vous présente le code :

Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
import java.util.regex.*;
 
public class Projet {
 
	public static void main(String args[]) {		  
		Integer port 	= 35353;
		Server myServer = Server.load(port);	// chargement du serveur
		myServer.start();   // démarrage du serveur
	}
}

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.io.*;
import java.net.*;
import java.util.*;
 
public class Server {
	private Vector<PrintWriter> _tabClients = new Vector<PrintWriter>(); // stockage des clients
	private static int _nbClients = 0;	
	private static Server _instance = null;	// singleton
	private int _port;
	private Log _log;
 
	// constructeur privé (singleton)
	private Server(int port) {
		_port 	= port;
		_log	= new LogConsole();
		_log.write("Server init.");
	}
 
	// recupération, chargement du serveur
	public static Server load(int port) {
		if(Server._instance == null)
			Server._instance = new Server(port);
		// si le serveur n'est pas chargé, on crée un nouveau serveur
		return Server._instance;
	}
 
	// démarrage du serveur
	public void start() {
	    try {
	    	_log.write("Server start ...");
		this.listen();	// en attente ...
	    }
	    catch (Exception e) {
	    	_log.write("error while starting.");
	    }
	}
 
	// en attente de flux entrant
	private void listen() {
	    try {	    	
		ServerSocket serverSocket = new ServerSocket(_port);
		while (true)
			new CThread(serverSocket.accept(), this);
			// un thread par flux entrant :s
	    }
	    catch (Exception e) {
	    	_log.write("error while listen.");
	    }
	}
 
	// envoi du flux à tous les clients
	synchronized public void sendAll(String message) {
		PrintWriter out;	// nouvelle sortie
		for (int i = 0; i < _tabClients.size(); i++) {
	    		// pour chaque printWrite du vecteur, on envoi le flux de sortie
	    		out = (PrintWriter) _tabClients.elementAt(i);
	    		if (out != null) {
	    			out.print(message);
	    			out.flush();
	    		}
	   	 }
	}
 
	// suppression de client
	synchronized public void delClient(int i) {
		Server._nbClients--;
		if (_tabClients.elementAt(i) != null) {
			_tabClients.removeElementAt(i);
			System.out.println("suppression client "+i);
		}
	}
 
	// ajout de client
	synchronized public int addClient(PrintWriter out) {
		Server._nbClients++;
		_tabClients.addElement(out);
		System.out.println("ajout client "+(_tabClients.size()-1));
		return _tabClients.size()-1;
	}
}
Code java : 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.net.*;
import java.util.regex.*;
import java.io.*;
 
// chargé de gerer les thread clients
class CThread implements Runnable {
	private Thread _thread;
	private Socket _socket;
	private PrintWriter _out;
	private BufferedReader _in;
	private Server _myServer;
	private int _numClient = 0;
 
	public CThread(Socket s, Server myServer) {
		_myServer = myServer;
		_socket	    = s;
		try {
	    		_out = new PrintWriter(_socket.getOutputStream());
	    		_in   = new BufferedReader(new InputStreamReader(_socket.getInputStream()));			
	    		_numClient = myServer.addClient(_out);
	    	}
	    	catch (IOException e){ }
 
	   	 _thread = new Thread(this);
	    	_thread.start();
	}
 
	public void run() {
		String inputLine  = "";
 
		try {			
			while((inputLine = _in.readLine()) != null) {
				System.out.println(inputLine);
				_myServer.sendAll(inputLine);
			}
		}
		catch (Exception e){ }
		finally {
			try {
				this._myServer.delClient(_numClient);
				_socket.close();
			}
			catch (IOException e){ }
		}
	}
}

La reception et l'envoi sont bons, les clients (en php) recoivent bien.
En plus de ca j'aimerais pouvoir choisir à quels clients envoyer tels messages, et je pense que actuellement c'est le fait d'avoir un thread par client qui me bloque.

Merci à ceux qui ont lu et qui essayeront de m'aider.

Cordialement