IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

probleme avec une application client/serveur


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 18
    Points
    18
    Par défaut probleme avec une application client/serveur
    bonjours a tous,
    je suis entrain de faire une petite apply client serveur qui fait du calcul distribué(en principe ), le probleme c'est que mes conaissences sont tres limitées en programmation reseau donc je me suit appuye sur un programme similaires qui fait du simple "ECHO" de se que lui envoi le client pour faire mon prog.
    le probleme c'est que ca bug lors des connexions mais j'ignore pourquoi.
    je vous soumet mon programme si vous pouvez me filer un petit coup de main.

    donc je vous explique rapidement le principe: la classe MonteCarlo fait un gros calcul(100K iteration ) donc on voudrai partagé le calcul entre plusieurs client(pour le moment j'en suis pas encore a la partie multi-thread/multi-client) donc le serveur lance le programme mais c'est les clients qui vont executer le calcul. pour cela la fonction nSimulation() de la classe MonteCarloObj fait le necessaire pour executer le code chez le client(enfait elle lui envoit un objet MonteCarloObj et il va lancer la methode simulation sur cet objet) .

    voici mon code



    le 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
     
    import java.net.*; import java.io.*;
    public class JabberClient {
     
    	public static void main(String[] args) throws IOException, ClassNotFoundException
    	{
    		InetAddress addr = InetAddress.getByName("localhost");
    		Socket socket = new Socket(addr, 8080);
    		try 
    		{
    			System.out.println("socket = " + socket);
    			// Création de l'output stream
    			ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
     
    			// Création de l'output stream
    			ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
     
    				while(true){
    				MonteCarloObj mco=(MonteCarloObj)ois.readObject();
    				oos.writeDouble(mco.simulation());
    				oos.flush();
    				}
     
    		} 
    		finally 
    		{
    			socket.close();
    		} 
    	}
     
    }


    le serveur



    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
    import java.io.IOException;
     
     
    public class JabberServer {
    	public static void main(String[] args)throws IOException, ClassNotFoundException 
    	{
    		String CallPutFlag = new String();
    		double S ;
    		double X ;
    		double T ;
    		double r ;
    		double b ;
    		double v ;
    		int nSteps ;
    		int nSimulations ;
     
    		CallPutFlag = "c" ;
    		S = 40 ;
    		X = 50 ;
    		T = 0.5 ;
    		r = 0.06 ;
    		b = 0.10 ;
    		v = 0.45 ;
    		nSteps = 168 ;
    		nSimulations = 100000 ;
     
    		double debut=System.currentTimeMillis();
     
    		MonteCarloObj test = new MonteCarloObj(CallPutFlag, S, X, T, r, b, v, nSteps, nSimulations);
    		double resultat = test.nSimulation();//la methode de MonteCarloObj qui lance les connexions
    		System.out.println(System.currentTimeMillis()-debut);
    		System.out.println("Voici le résultat " + resultat );
     
    	}
    }

    MonteCarloObj


    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
     
     
    import java.io.*;
    import java.net.*;
    import java.util.Random;
     
     
    public class MonteCarloObj {
     
     
     
    	public MonteCarloObj(String CallPutFlagArg, double SArg, 
    			double XArg, double TArg, double rArg, double bArg,	
    			double vArg, int nStepsArg, int nSimulationsArg)
    	{
    		CallPutFlag=new String(CallPutFlagArg);
    		S=SArg;
    		X=XArg;
    		T=TArg;
    		r=rArg;
    		b=bArg;
    		v=vArg;
    		nSteps=nStepsArg;
    		nSimulations=nSimulationsArg;
    	}
     
     
    	public double simulation()
    	{
    		Random rndm = new Random(10);
    		double dt = T / nSteps ;
    		double Drift = (b - v*v / 2) * dt ;
    		double vSqrdt = v * java.lang.Math.sqrt(dt);
    		double St=S;
    		for (int j = 1; j<= nSteps ; j++ )
    		{
    			St = St * java.lang.Math.exp(Drift + vSqrdt * rndm.nextGaussian());
    		}
    		return St;
    	}
     
     
     
     
    	public double nSimulation() throws IOException, ClassNotFoundException
    	{
    		double   Sum = 0,  z = 1 ;
     
     
     
     
    		if (CallPutFlag.equals("c"))	{z = 1;}
    		else if (CallPutFlag.equals("p")) {z = -1;}
    		else {return (0);}
    		ServerSocket serverSock = new ServerSocket(8080);
    		try 
    		{
    			Socket socket = serverSock.accept(); // Le prog stoppe et attend une conxn
    			try 
    			{
    				// Création de l'output stream
    				ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
     
    				// Création de l'input stream
    				ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
    				for (int i = 1; i<= nSimulations ; i++ )
    				{
    					oos.writeObject(this);
    					oos.flush();
    					double d= ois.readDouble();
    					Sum = Sum + Math.max(z * (d - X), 0);
    				}
     
    			} 
    			finally 
    			{
    				System.out.println("closing...");
    				socket.close();
    			}
    		} 
    		finally 
    		{
    			serverSock.close();
    		}
     
     
    		double MonteCarloStandardOption = java.lang.Math.exp(-r * T) * (Sum / nSimulations);
     
    		return (MonteCarloStandardOption);		
    	}
     
    	private String CallPutFlag;
    	private double S ;
    	private double X ;
    	private double T ;
    	private double r ;
    	private double b ;
    	private double v ;
    	private int nSteps ;
    	private int nSimulations ;
     
     
     
    }

  2. #2
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Bonjour, pourrais-tu donner plus d'informations sur l'erreur?

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 18
    Points
    18
    Par défaut
    rebonjour,
    en fait j'ai une exception qui est lancé au niveau de nSimulations() du serveur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "main" java.io.NotSerializableException: MonteCarloObj
    	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    	at java.io.ObjectOutputStream.writeObject(Unknown Source)
    	at MonteCarloObj.nSimulation(MonteCarloObj.java:68)
    	at JabberServer.main(JabberServer.java:30)
    les erreur se situent au niveau des write/readObject je pense.
    voila

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    change la définition de ta classe par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class MonteCarloObj implements Serializable {
    Tu ne peux pas écrire un objet s'il n'est pas sérialisable, donc s'il n'implémente pas l'interface java.io.Serializable.

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 18
    Points
    18
    Par défaut
    super ca a l'aire de marcher. il me reste a sortir de la boucle infinie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    				while(true){
    				MonteCarloObj mco=(MonteCarloObj)ois.readObject();
    				oos.writeDouble(mco.simulation());
    				oos.flush();
    				}
    et la j'ai 2 questions

    *readObject() n'est pas bloquant(enfin c'est l'impresion que j'ai) or j'aimerai qu'il s'arrete en attendant qu'il y ai un objet en lecture.

    *pour sortir de la boucle infini (celle juste plus haut) j'ai pensé a ce que le serveur ecrive un objet qui ne soit pas de type MonteCarloObj et que le client le detect et face un break ou un truc comme ca... mais je ne sais pas quel type d'objet ecrie ou s'il y en a un de prevu pour ce genre de situations.

    merci

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 18
    Points
    18
    Par défaut
    bon j'ai trouvé une solution (pas tres elegante certe) j'ai juste mis un boolean "fin" dans MonteCarloObj que je met a true que j'envoi a la fin de la simulation je fait un test a chaque fois dans mon client et quand je detecte cet objet je fait un break. voila, je reviens vous voir pour mon serveur multi client

  7. #7
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 48
    Points : 18
    Points
    18
    Par défaut
    rebonsoir je reviens avec une version multi thread de mon pti programme (enfin pour le moment ca ne fonctionne qu'avec un seul thread)

    voici le code(je ne remet pas mon client car il n'a pas changé)


    la calsse du serveur

    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
    import java.io.*;
    import java.net.*;
     
    public class JabberServer {
    	public static void main(String[] args)throws IOException, ClassNotFoundException 
    	{
    		String CallPutFlag = new String();
    		double S ;
    		double X ;
    		double T ;
    		double r ;
    		double b ;
    		double v ;
    		int nSteps ;
    		int nSimulations ;
     
    		CallPutFlag = "c" ;
    		S = 40 ;
    		X = 50 ;
    		T = 0.5 ;
    		r = 0.06 ;
    		b = 0.10 ;
    		v = 0.45 ;
    		nSteps = 168 ;
    		nSimulations = 100000 ;
     
    		double debut=System.currentTimeMillis();
     
    		MonteCarloObj test = new MonteCarloObj(CallPutFlag, S, X, T, r, b, v, nSteps, nSimulations);
    		ServerSocket serverSock = new ServerSocket(8080);
    		try 
    		{
     
    				new MonteCarloThread(serverSock.accept(),test); // Le prog stoppe et attend une conxn
    				while(!test.fini())
    				{}
     
    		} 
    		finally 
    		{
    			serverSock.close();
    		}
     
     
     
     
    		System.out.println(System.currentTimeMillis()-debut);
    		System.out.println("Voici le résultat " + test.resultat() );
     
    	}
     
     
    }
    alors coté serveur, pas grand chose on cree un objet MonteCarloObj(notre objetv principale sur lequel on va faire le calcul et qui est partagée par tous les threads) ainsi qu'un serverSoket et on attend une connexion pour lancer notre thread. ensuite une boucle infini verifi si le travail est terminé, c'est juste un artifice pour verifier si cela fonctionne avec un thread.

    la j'ai mes premiere question:
    * l'objet MonteCarloObjet que je transmet au thread sera-t-il le meme que celui que j'ai creer dans le serveur ou simplement une copie? en fait je voudrais que cet objet soit partagé par tous les threads...
    *pour pouvoir faire quelque chose de reelement multi thread il me faudrais utiliser un accept non bloquant, de maniere a faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(!test.fini())
    {
    new MonteCarloThread(serverSock.accept(),test); // Le prog stoppe et attend une conxn
    }
    voila je met le reste du code si ca peut servir a quuelqu'un ou si vous avez des remarques. voilou

    la classe des threads
    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
    public class MonteCarloThread implements Runnable
    {
     
    	MonteCarloThread(Socket s,  MonteCarloObj monteCarloObj)throws IOException
    	{
    		_monteCarloObj=monteCarloObj; 
    	    _s=s; 
     
    	    try
    	    {
    	    	oos = new ObjectOutputStream(_s.getOutputStream());
    			ois = new ObjectInputStream(_s.getInputStream());
    	    }
    	    finally{}
     
    	    _t = new Thread(this);
    	    _t.start();
    	  }
     
     
    	public void run()
    	{
    		try
    	    {
    			double aFaire=_monteCarloObj.prendre();
    			while(aFaire >0)
    			{
    				Sum=_monteCarloObj.nSimulation(oos,ois,aFaire);
    				fait +=aFaire;
    				aFaire=_monteCarloObj.prendre();
    			}
     
    	    	MonteCarloObj fin = new MonteCarloObj();
    			oos.writeObject(fin);
    			oos.flush();
    			_monteCarloObj.add(Sum, fait);
    	    }
    	    catch (Exception e){ }
    	    finally 
    	    {
    	    	try
    		    {
    				System.out.println("closing...");
    				_s.close();
    		    }
    	    catch (Exception e){ }
    	    }
    	}
     
    	private ObjectOutputStream oos;
    	private ObjectInputStream ois;
    	private MonteCarloObj _monteCarloObj;
    	private Thread _t; // contiendra le thread du client
    	private Socket _s; // recevra le socket liant au client
    	private double Sum=0;
    	private double fait=0;
     
    }
    MonteCarloObj

    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
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
     
    import java.io.*;
    import java.util.Random;
     
     
    public class MonteCarloObj implements Serializable{
     
     
     
    	public MonteCarloObj(String CallPutFlagArg, double SArg, 
    			double XArg, double TArg, double rArg, double bArg,	
    			double vArg, int nStepsArg, int nSimulationsArg)
    	{
    		CallPutFlag=new String(CallPutFlagArg);
    		S=SArg;
    		X=XArg;
    		T=TArg;
    		r=rArg;
    		b=bArg;
    		v=vArg;
    		nSteps=nStepsArg;
    		nSimulations=nSimulationsArg;
    		restant =nSimulationsArg;
    		end=false;
    		Sum=0;
    		fait=0;
    	}
     
    	public MonteCarloObj()
    	{
    		CallPutFlag=new String("");
    		S=0;
    		X=0;
    		T=0;
    		r=0;
    		b=0;
    		v=0;
    		nSteps=0;
    		nSimulations=0;
    		end=true;
    	}
     
    	public boolean fin(){return end;}
     
    	public double simulation()
    	{
    		Random rndm = new Random(10);
    		double dt = T / nSteps ;
    		double Drift = (b - v*v / 2) * dt ;
    		double vSqrdt = v * java.lang.Math.sqrt(dt);
    		double St=S;
    		for (int j = 1; j<= nSteps ; j++ )
    		{
    			St = St * java.lang.Math.exp(Drift + vSqrdt * rndm.nextGaussian());
    		}
    		return St;
    	}
     
     
     
     
    	public double nSimulation(ObjectOutputStream oos,ObjectInputStream ois,double aFaire) throws IOException, ClassNotFoundException
    	{
    		double   Sum = 0,  z = 1 ; 	
    		ObjectOutputStream _oos=oos;
    		ObjectInputStream _ois=ois;
     
     
     
     
    		if (CallPutFlag.equals("c"))	{z = 1;}
    		else if (CallPutFlag.equals("p")) {z = -1;}
    		else {return (0);}
     
    				for (int i = 1; i<= aFaire ; i++ )
    				{
     
    					_oos.writeObject(this);
    					_oos.flush();
    					double d= _ois.readDouble();
    					Sum = Sum + Math.max(z * (d - X), 0);
    				}
     
     
    				return Sum;
    	}
     
     
    	synchronized public double prendre()
    	{
    		if (restant==0)
    			return 0;
    		if (restant>=200)
    		{
    			restant-=200;
    			return 200;
    		}
    		else 
    		{
    			double d=restant;
    			restant=0;
    			return d;
    		}
    	}
     
     
    	synchronized public void add(double _Sum,double _fait)
    	{
    		Sum+=_Sum;
    		fait+=_fait;
    	}
     
    	public double resultat()
    	{
    		return java.lang.Math.exp(-r * T) * (Sum / nSimulations);
    	}
     
    	synchronized public boolean fini()
    	{
    		if(fait==nSimulations) return true;
    		return false;
    	}
     
    	private String CallPutFlag;
    	private double S ;
    	private double X ;
    	private double T ;
    	private double r ;
    	private double b ;
    	private double v ;
    	private int nSteps ;
    	private int nSimulations ;
    	private boolean end;
    	private double restant;
    	private double Sum;
    	private double fait;
    	private static final long serialVersionUID = 35878768876L;
     
     
    }

Discussions similaires

  1. Probleme deploiment d'une application client/serveur
    Par karimot dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/01/2014, 22h05
  2. Réponses: 4
    Dernier message: 06/04/2012, 17h46
  3. [WD14] Souci avec le déploiement d'une application client-serveur
    Par noviceman1 dans le forum WinDev
    Réponses: 1
    Dernier message: 22/02/2012, 17h35
  4. Réponses: 4
    Dernier message: 11/03/2010, 13h09
  5. conception et réalisation d'une application client/serveur
    Par masvivi dans le forum Développement
    Réponses: 1
    Dernier message: 24/08/2005, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo