Bonjour,
voici mon problème,
J'ai une architecture de type mvc dont le controller appelle la vue et le modèle.
la partie qui m'intéresse est celle-ci:
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 package PFIL.MainPackage; import java.awt.event.*; import java.util.Observable; import PFIL.CarnetAdresses.*; import PFIL.PartageClient.*; import PFIL.PartageServeur.*; import PFIL.Preferences.*; import javax.swing.*; /** * * @author Benats Guillaume * Roland Charles **/ public class MainController{ //OVERVIEW: Interfacage entre la vue et le modèle d'accueil du programme MainView view; MainModel model; public MainController(){ view = new MainView(); view.activateFrame(adressBookListener, clientListener, serverListener, prefListener); model = new MainModel(); model.addObserver(view); } ActionListener prefListener = new ActionListener(){ public void actionPerformed(ActionEvent e){ } }; ActionListener clientListener = new ActionListener(){ public void actionPerformed(ActionEvent e){ ConnectToServController client = new ConnectToServController(); } }; ActionListener serverListener = new ActionListener(){ public void actionPerformed(ActionEvent e){ try{ TCPServer serv = new TCPServer(); serv.launch(); }catch(Exception err){ err.printStackTrace(); } } }; ActionListener adressBookListener = new ActionListener(){ public void actionPerformed(ActionEvent e){ CarnetAdresseController adressBook = new CarnetAdresseController(); } }; public static void main(String[] args){ //REQUIRES: / //MODIFIES: / //EFFECTS: Lance le programme MainController pfil = new MainController(); } }
ce listener instancie une classe qui est en fait un serveur TCP basique:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 ActionListener clientListener = new ActionListener(){ public void actionPerformed(ActionEvent e){ ConnectToServController client = new ConnectToServController(); } };
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 package PFIL.PartageServeur; import java.io.*; import java.net.*; /** * * @authors Benats Guillaume * Roland Charles **/ public class TCPServer implements Runnable{ //OVERVIEW: Gestion du serveur de partage ServerSocket srv; BufferedReader clientInput; OutputStream clientOutput; public TCPServer(){ try{ srv = new ServerSocket(1234); }catch(IOException e){ e.printStackTrace(); } } public TCPServer(Socket client) throws Exception { clientInput = new BufferedReader(new InputStreamReader(client.getInputStream())); clientOutput = client.getOutputStream(); } public void run() { try{ int level = 3; String line = clientInput.readLine(); if(line != null){ level = Integer.parseInt(line); } if((line = clientInput.readLine()) != null){ File f = new File("."+File.separator+"xml"); System.out.print("Client request for file " + line + "..."); if(f.exists()) { copyStream(new FileInputStream(f), clientOutput, true); System.out.println(" transfer done."); }else if(level > 0){ System.out.println(" file is not here, lookup further..."); boolean found = lookupFurther(level-1, line, clientOutput); System.out.println(found ? "Transfer done." : "File not found."); } } clientInput.close(); clientOutput.close(); }catch(Exception e){ e.printStackTrace(); } } static boolean lookupFurther(int level, String fname, OutputStream out) throws IOException{ BufferedReader hosts; try{ hosts = new BufferedReader(new FileReader("servers.list")); }catch(FileNotFoundException e) { System.out.println("No servers.list file, can't lookup further !"); return false; } String ip; boolean found = false; while(! found && (ip = hosts.readLine()) != null){ System.out.println("trying server " + ip); try{ Socket s = new Socket(ip, 1234); PrintWriter srv = new PrintWriter(s.getOutputStream(), true); srv.println(level + "\n" + fname); int nbytes = copyStream(s.getInputStream(), out, true); s.close(); found = (nbytes > 0); }catch(ConnectException e){ e.printStackTrace(); } } hosts.close(); return found; } public static int copyStream(InputStream in, OutputStream out, boolean close) throws IOException{ int nbytes = 0, total = 0; byte[] buf = new byte[1024]; while ((nbytes = in.read(buf)) > 0) { out.write(buf, 0, nbytes); total += nbytes; } if(close){ in.close(); } return total; } public void launch(){ while(true) { try{ Thread t = new Thread(new TCPServer(srv.accept())); t.start(); }catch(Exception e){ e.printStackTrace(); } } } }
Pourtant malgré que le TCPServer soit exécuté dans un thread séparé, quand je clique sur le bouton swing activant mon listener qui lui-meme instancie le TCPServer, Swing se freeze et attends la fin du TCPServer (ce qui n'arrive pas évidemment, vu la boucle infinie) donc je suis un peu perdu...
Comment se fait-il que swing freeze alors que je lance un nouveau thread?
sans swing, tout marche nickel...
un grand merci![]()
Partager