Signaler

Client server [Résolu]

Posez votre question adamsjilal 18Messages postés lundi 14 mars 2016Date d'inscription 9 février 2017 Dernière intervention - Dernière réponse le 9 févr. 2017 à 22:14 par KX
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)
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.
Afficher la suite 
Utile
+0
moins plus
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 :

"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.
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !