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
Partager