Client server
Résolu
adamsjilal
Messages postés
46
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
bonjour,
je viens de créer un chronomètre et ce chronomètre fonctionne normalement mais je voudrais le migrer vers une architecture client client serveur du coup je fait une classe chronomètre qui va être classe cliente et classe Timer va jouer le rôle de serveur en plus de ça je prévu une classe service qui va exécuter l'ensemble de tache a savoir le démarrage du chronomètre, l’arrêt et autre.
lorsque je fais tout ça je crois j'ai un soucie. ce soucie c'est que l'ordinateur se bloque totalement j'arrive pas a faire quoique ça soit. et je sais pas ça vient d'ou le problème.
voici la classe serveur(Timer)
et voici la class client(chronometre)
la class contenant les service(service)
enfin la class contenant la method main qui affiche l'interface du chronometre
je voudrait que vous me aider a trouver le problème et tout autre suggestion.Merci en avance.
je viens de créer un chronomètre et ce chronomètre fonctionne normalement mais je voudrais le migrer vers une architecture client client serveur du coup je fait une classe chronomètre qui va être classe cliente et classe Timer va jouer le rôle de serveur en plus de ça je prévu une classe service qui va exécuter l'ensemble de tache a savoir le démarrage du chronomètre, l’arrêt et autre.
lorsque je fais tout ça je crois j'ai un soucie. ce soucie c'est que l'ordinateur se bloque totalement j'arrive pas a faire quoique ça soit. et je sais pas ça vient d'ou le problème.
voici la classe serveur(Timer)
package Timer; import java.awt.Canvas; import java.awt.Graphics; import java.awt.Point; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Timer extends Canvas implements Runnable { private ServerSocket ss; private Socket socket; private static final long serialVersionUID = 1L; public Timer() { super(); points.add(new Point(20,10)); points.add(new Point(10,20)); points.add(new Point(0,10)); points.add(new Point(10,0)); } public void paint(Graphics g) { g.drawOval(0, 0, 20, 20); g.drawLine(10, 10, 10, 0); } public void update(Graphics g) { updatePoint(); g.clearRect(0, 0, 20, 20); g.drawOval(0, 0, 20, 20); g.drawLine(pt1.x, pt1.y, pt2.x, pt2.y); } public void emettreTick() { TickEvent e = new TickEvent(); Iterator<TickListener> it = listener.iterator(); while (it.hasNext()) { TickListener l = (TickListener) it.next(); l.tick(e); } } public void addTickListener(TickListener l) { listener.add(l); } public void run() { while (alive) { try { update(); Thread.sleep(periode); } catch (InterruptedException e) { e.printStackTrace(); } } } public void start() { Thread th = new Thread(this); alive = true; th.start(); } public void stop() { alive = false; } public void update() { emettreTick(); this.repaint(); } public void updatePoint() { indice = (indice+1)%(points.size()); pt2 = (Point) points.get(indice); } public void setPeriode(int p){ periode=p; } public long getPeriode(){ return periode; } public static void main(String[] args) throws Exception{ //Pour demarrer le serveur de timer iniserver(); } public static void iniserver() throws Exception{ ServerSocket ss = new ServerSocket(1111); System.out.println("dans l'attende d'une connection"); Socket socket = ss.accept(); System.out.println("vous etes connecté..."); while(true){ new serviceChroTime(socket).start(); } } private List<TickListener> listener = new ArrayList<TickListener>(); private volatile boolean alive = true; private List<Point> points = new ArrayList<Point>(); private long periode = 1000; private int indice=2; private Point pt1 = new Point(10, 10); private Point pt2 = new Point(10, 0); }
et voici la class client(chronometre)
package timerListe; import java.awt.Button; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Font; import java.awt.List; import java.awt.Panel; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; import Timer.TickEvent; import Timer.TickListener; import Timer.Timer; public class chronometreAvecListe extends Panel { private Button btnstop, btnstart, btnintialise, btntour, connexion; private String sec ="00", min="00", hour="00"; private static int i=0; private TextField txt; private List liste; private boolean res; private Thread thr; private Timer timer; private static int heur =0; private static int minute=0; private static int second=0; private PrintWriter pw; private OutputStream out ; private BufferedReader br; private Socket s; private InputStream is; public chronometreAvecListe(){ super(); initcomponent(); } public void initcomponent(){ setLayout(new FlowLayout()); liste = new List(); btnstop = new Button("stop"); btnstop.setEnabled(false); btnstop.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ pw.println("stop"); timer.stop(); stop(); btnintialise.setVisible(true); btnstart.setEnabled(true); btnintialise.setEnabled(true); btnstop.setEnabled(false); btntour.setEnabled(false); } }); btnstop.setBounds(50,100,60,20); btnstart = new Button("start"); btnstart.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ pw.println("start"); //timer.start(); res = true; thr = new Thread(new startChrono()); thr.start(); btnstart.setBackground(null); btnstop.setEnabled(true); btntour.setEnabled(true); btnstart.setEnabled(false); btnintialise.setEnabled(false); btntour.setEnabled(true); } }); btnstart.setBounds(50,100,60,20); btnintialise = new Button("Initialiser"); btnintialise.setEnabled(false); btnintialise.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ initialiser(); liste.removeAll(); } }); btnintialise.setBounds(50,100,60,20); btntour = new Button("Tour"); btntour.setEnabled(false); connexion = new Button("Se connecter au server"); connexion.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub connectionClient(); } }); timer = new Timer(); timer.addTickListener(new TickListener() { public void tick(TickEvent e) { // System.out.println("Action"); updateText(); } }); timer.setBounds(40, 60, 70, 30); btntour.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ i++; liste.add(i+"--->"+txt.getText()); } }); txt = new TextField(hour+":"+min+":"+sec); txt.setBounds(100,50,120,30); txt.setEditable(false); Font font = new Font("Arial",Font.BOLD,20); txt.setFont(font); txt.setForeground(Color.BLACK); txt.setBackground(Color.WHITE); add(txt); add(timer); add(liste); add(btnstart); add(btnstop); add(btnintialise); add(btntour); add(connexion); } public void connectionClient(){ try { s = new Socket("localhost",1111); is = s.getInputStream(); InputStreamReader isr = new InputStreamReader(is); br = new BufferedReader(isr); out = s.getOutputStream(); pw = new PrintWriter(out, true); pw.println("start"); int resultat = is.read(); System.out.println("le resultat est : "+resultat); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public class startChrono implements Runnable{ public void run(){ start(); } } public void updateText(){ if(second<10){ sec = "0"+second; }else{ sec = ""+second; } if(minute<10){ min = "0"+minute; }else{ min = ""+minute; } if(heur<10){ hour = "0"+heur; }else{ hour=""+heur; } txt.setText(hour+":"+min+":"+sec); } public void start(){ while(res){ if(second == 60){ second=0; minute++; } if(minute==60){ minute=0; heur++; } this.updateText(); try{ Thread.sleep(1000); }catch(InterruptedException e){ e.printStackTrace(); } second++; } } public void stop(){ res=false; } public void initialiser(){ second=0; minute=0; heur=0; i=0; txt.setText("0"+heur+":"+"0"+minute+":"+"0"+second); liste.removeAll(); thr.stop(); } }
la class contenant les service(service)
package Timer; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; public class serviceChroTime extends Thread { private Socket socket; private BufferedReader reader; private Timer timer; public serviceChroTime(Socket socket){ this.socket = socket; } public void run() { try{ while(true){ reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); if(reader.readLine().equals("start")){ timer = new Timer(); timer.start(); } if(reader.readLine().equals("stop")){ timer = new Timer(); timer.stop(); } } }catch(Exception e){ e.printStackTrace(); } } }
enfin la class contenant la method main qui affiche l'interface du chronometre
package timerListe; import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Frame frameList = new Frame("Timer-chronometre Avec list"); frameList.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); chronometreAvecListe chrono = new chronometreAvecListe(); frameList.add(chrono); frameList.setSize(400,350); frameList.setVisible(true); frameList.pack(); } }
je voudrait que vous me aider a trouver le problème et tout autre suggestion.Merci en avance.
A voir également:
- Client server
- Cybera client - Télécharger - Divers Réseau & Wi-Fi
- Filezilla client - Télécharger - Téléchargement & Transfert
- Cybera server - Télécharger - Divers Réseau & Wi-Fi
- Ps3 media server - Télécharger - Divers Réseau & Wi-Fi
- Filezilla server - Télécharger - Téléchargement & Transfert
1 réponse
Bonjour,
Le problème vient de la classe Timer, elle génère un nombre monstrueux de threads identiques qui consomme la RAM de ton PC.

Voici la stack des threads qui sont créés :
Le problème vient donc de la méthode run() de serviceChroTime qui est appelé indéfiniment et ce à cause de ta boucle while dans la classe Timer.
Ta boucle tourne sans jamais s'arrêter créant de nouveaux threads en continue. Commences par supprimer cette boucle while, un seul thread devrait suffire pour l'instant.
Le problème vient de la classe Timer, elle génère un nombre monstrueux de threads identiques qui consomme la RAM de ton PC.

Voici la stack des threads qui sont créés :
"Thread-8254" #8268 prio=5 os_prio=0 tid=0x0000000369fa3800 nid=0x2a680 runnable [0x00000003985bf000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at java.net.SocketInputStream.read(Unknown Source)
at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
at sun.nio.cs.StreamDecoder.read(Unknown Source)
- locked <0x00000000de2a6658> (a java.io.InputStreamReader)
at java.io.InputStreamReader.read(Unknown Source)
at java.io.BufferedReader.fill(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
- locked <0x00000000de2a6658> (a java.io.InputStreamReader)
at java.io.BufferedReader.readLine(Unknown Source)
at timer.serviceChroTime.run(serviceChroTime.java:23)
Le problème vient donc de la méthode run() de serviceChroTime qui est appelé indéfiniment et ce à cause de ta boucle while dans la classe Timer.
public static void iniserver() throws Exception { ServerSocket ss = new ServerSocket(1111); System.out.println("dans l'attende d'une connection"); Socket socket = ss.accept(); System.out.println("vous etes connecté..."); while (true) { new serviceChroTime(socket).start(); } }
Ta boucle tourne sans jamais s'arrêter créant de nouveaux threads en continue. Commences par supprimer cette boucle while, un seul thread devrait suffire pour l'instant.