Bonjour à tous,
voici le problème, je dois avoir un Client TCP et un serveur TCP tournant sur la même machine (pour du partage de fichier sans rentrer dans les détails), chaque noeud du partage sera donc client et serveur. Seulement voilà je m'y perds un peu au niveau de threads. Je vous donne un exemple:
Mon serveur tcp (basique):
et mon 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 package PFIL.PartageServeur; import java.io.*; import java.net.*; import PFIL.CarnetAdresses.XmlReader; import PFIL.PartageClient.TCPClient; /** * * @author Benats Guillaume * Roland Charles **/ public class TCPServer { //OVERVIEW: Gestion du serveur de partage public TCPServer(){ ThreadTCP servOn = new ThreadTCP(); servOn.run(); } private class ThreadTCP extends Thread{ //REQUIRES: / //MODIFIES: / //EFFECTS: Lance un nouveau thread pour le serveur TCP public void run(){ try{ activateServ(); }catch(Exception e){ e.printStackTrace(); } } }; private static void activateServ() throws Exception{ //REQUIRES: / //MODIFIES: / //EFFECTS: Lance le serveur TCP String clientSentence; String servSentence; String capitalizedSentence; ServerSocket welcomeSocket = new ServerSocket(6789); while(true) { Socket connectionSocket = welcomeSocket.accept(); System.out.println("Prise en charge du client " + connectionSocket.getInetAddress().getHostAddress() + " sur le port " + connectionSocket.getPort() + " de " + InetAddress.getLocalHost().getHostAddress() + " sur le port " + connectionSocket.getLocalPort()); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); servSentence = "Login?"; int b = Integer.parseInt(servSentence); outToClient.write(b); clientSentence = inFromClient.readLine(); System.out.println("Reçu: " + clientSentence); boolean verif = verifyLogin(clientSentence); if(!verif){ servSentence = "Utilisateur non reconnu!"; b = Integer.parseInt(servSentence); outToClient.write(b); break; } capitalizedSentence = clientSentence.toUpperCase() + "\n"; outToClient.writeBytes(capitalizedSentence); } } private static boolean verifyLogin(String clLogin){ XmlReader x = new XmlReader(); String[] t = x.read(); for(int i = 0; i<t.length; i++){ if(t[i].equals(clLogin)){ return true; } } return false; } }
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 package PFIL.PartageClient; import java.io.*; import java.net.*; /** * @author Benats Guillaume * Roland Charles **/ public class TCPClient{ public TCPClient(){ ThreadTCP cliOn = new ThreadTCP(); cliOn.run(); } private class ThreadTCP extends Thread{ //REQUIRES: / //MODIFIES: / //EFFECTS: Lance un nouveau thread pour le serveur TCP public void run(){ try{ activateCli(); }catch(Exception e){ e.printStackTrace(); } } }; private static void activateCli() throws Exception{ //REQUIRES: / //MODIFIES: / //EFFECTS: Lance le serveur TCP String sentence; String modifiedSentence; BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); Socket clientSocket = new Socket("localhost",6789); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + '\n'); modifiedSentence = inFromServer.readLine(); System.out.println("Du serveur: " + modifiedSentence); clientSocket.close(); } }
Seulement voilà, quand je lance une instance de TCPServer via le run() et la même chose pour le client, les deux thread ne sont pas séparés et le serveur attends une connexion du client en boucle, et forcément tant que cette boucle n'est pas finie, il ne saura pas que le client se connecte juste après..
Comment faire donc pour que le serveur et le client d'une même machine interragissent?
un grand merci,
Guillaume.
Partager