bonjour
J'ai un soucis avec mon programme. Il est composé de 3 class: GUI, controller, tcpServer.
La class GUI est mon interface graphique (JFrame) qui comporte juste 3 boutons : démarrer, arreter et quitter.
La class controller extends de runnable et (pour l'instant) sert juste a lancer une instance de la class tcpServer.
La class tcpServer extends Thread et sert à écouté les connexions sur le réseau, elle comporte donc une boucle infini.
Le bouton démarrer lance une instance de controller, qui elle lance un thread tcpServer. Ceci fonctionne bien, la thread tcpServer ecoute bien les connexion sur le réseau. Le problème est que quand je clique sur le bouton arreter l'interface graphique se bloque et le programme plante.
Je voudrai pouvoir arreté et relancer mon controller via l'interface graphique.
=> Class Controller :
public class Controller implements Runnable{
tcpServer ecoute;
public void run(){
new Thread().start();
ecoute = new tcpServer();
ecoute.start();
System.out.println("démarrer");
}
//fonction qui arrete le thread tcpServer, executer losqu'on
//appui sur le bouton arreter dans l'interface graphique
public void arret(){
ecoute.stop();
}
}
=> class tcpServer
public class tcpServer extends Thread{
public synchronized void run(){
System.out.println("Controller lancé !!");
int port = 5555;
ServerSocket server_socket;
BufferedReader input;
try {
server_socket = new ServerSocket(port);
System.out.println("En attente de client sur le port " + server_socket.getLocalPort());
while(true) {
Socket s = server_socket.accept();
System.out.println("Nouvelle connexion accepté " + s.getInetAddress() + ":" + s.getPort());
input = new BufferedReader(new InputStreamReader(s.getInputStream()));
try {
while(true) {
String message = input.readLine();
if (message==null) break;
System.out.println(message);
}
}
catch (IOException e) {
System.out.println(e);
}
try {
s.close();
System.out.println("Connexion fermé par le client");
}
catch (IOException e) {
System.out.println(e);
}
}
}
catch (IOException e) {
System.out.println(e);
}
}
}
=> class GUI
public class GUI extends JFrame implements ActionListener{
JPanel _center;
JLabel _titre;
JButton start, stop, quit;
Controller controller;
public GUI(){
this.setTitle("Interface Graphique Server");
this.getContentPane().setLayout(new BorderLayout());
_titre = new JLabel("Interface avec le controller");
this.getContentPane().add(BorderLayout.NORTH, _titre);
_center = new JPanel();
_center.setLayout(new FlowLayout());
start = new JButton("START Controller");
start.addActionListener(this);
stop = new JButton("STOP Controller");
stop.addActionListener(this);
_center.add(start);
_center.add(stop);
this.getContentPane().add(BorderLayout.CENTER, _center);
quit = new JButton("QUIT");
quit.addActionListener(this);
this.getContentPane().add(BorderLayout.SOUTH, quit);
this.pack();
this.show();
}
public void actionPerformed(ActionEvent e) {
if(e.getSource() == start){
controller = new Controller();
controller.run();
System.out.println("Démarrage du controller");
}
if(e.getSource() == stop){
controller.arret();
System.out.println("Arrêt du controller");
}
if(e.getSource() == quit){
System.exit(0);
}
}
public static void main(String[] args){
new GUI();
}
}
Merci d'avance pour vos réponses