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

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs Discussion :

Client - Serveur - Sérializable


Sujet :

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 50
    Points
    50
    Par défaut Client - Serveur - Sérializable
    Bonjour,

    Je cherche à envoyer une donnée structurée à travers un socket. Cette donnée est en fait un objet qui contient deux long :

    [XMLInit lit dans un .xml et renvoie les données voulues avec l'aide d'une autre classe XMLManager qui lit une donnée dans n'importe quel .xml]

    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
    public class DataScheduler implements java.io.Serializable {
     
    	private long top;
    	private long delta;
     
    	public long getXMLTop(){
     
    		XMLManager xml = new XMLManager("Scheduler.xml");
    		long top = Long.parseLong(xml.getXMLValue("Top;Valeur", "", ""));
     
    		return top;
    	}
     
    	public long getXMLDelta(){
     
    		XMLManager xml = new XMLManager("Scheduler.xml");
    		long delta = Long.parseLong(xml.getXMLValue("Delta;Valeur", "", ""));
     
    		return delta;
    	}
     
    	public long getTop(){
     
    		return this.top;
    	}
     
    	public long getDelta(){
     
    		return this.delta;
    	}
     
    	public DataScheduler(){
     
    		this.top = this.getXMLTop();
    		this.delta = this.getXMLDelta();
     
    	}
    }
    Mon serveur ne va faire qu'envoyer l'objet et le client va le lire et l'afficher.

    Classe qui sert de 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
    public class C_Scheduler {
     
    	public void timer (long numberOfSeconds){
     
    		try {
    	    	 Thread.sleep(numberOfSeconds*1000);
    	     } catch(InterruptedException ex) {
    		    Thread.currentThread().interrupt();
    	     }
    	}
     
    	public static void main(String[] args) throws IOException{
     
    		C_Scheduler s = new C_Scheduler();
     
    		System.out.println("Scheduler's window \n");
     
    		// Lecture des données pour le scheduler (XML)
    		DataScheduler ds = new DataScheduler();
     
    		// Initialisation pour le port
    		XMLInit xml = new XMLInit();
    		int portOfScheduler = xml.getNumberOfSchedulerPort();
     
    		// Ouverture du port
    		ServerSocket serverSocket = new ServerSocket(portOfScheduler);
    		serverSocket.setSoTimeout(0);
    		Socket schedulerServer = serverSocket.accept();
    		ObjectOutputStream out = new ObjectOutputStream(schedulerServer.getOutputStream());
     
    		while (true)
    		{
    			s.timer(ds.getTop());
     
    			// Ecriture des données sur le port (Object)
    			out.writeObject(ds);
    			out.flush();
    		}
    	}
    }
    J'utilise ainsi ObjectOutput comme j'ai cru comprendre que cela pouvait m'aider à serializer mon objet.

    Code 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
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.net.Socket;
     
    public class C_Client {
     
    	public static void main(String[] args) throws IOException, ClassNotFoundException{
     
    		String serverName = "localHost";
     
    		// Récupération du port 
    		XMLInit xml = new XMLInit();
    		int port = xml.getNumberOfClientPort("Client1");
     
    		// Ouverture du port
    		Socket client = new Socket(serverName, port);
    		ObjectInputStream in = new ObjectInputStream(client.getInputStream());
     
    		// Lecture des données
     
    		while (true){
    			DataScheduler ds = (DataScheduler)in.readObject();
    			System.out.println ("Delta : " + ds.getDelta() + " et top : " + ds.getTop());
    		}
    	}
    }
    Le soucis est que cela ne fonctionne pas du tout et je n'arrive pas à trouver où est la faute. Le problème serait une erreur dans l'écriture dans a socket mais je ne vois pas pourquoi cela ne marche pas.

    Si vous pouvez m'aider, je vous serais reconnaissante, j'ai tout essayé mais désespère à faire marcher cette petite application.

    Merci par avance.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Lyadrielle Voir le message
    Le soucis est que cela ne fonctionne pas
    Mais encore? Merci de préciser.

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 50
    Points
    50
    Par défaut Re:
    Cela me mettait que j'avais un soucis dans l'écriture de l'objet apparemment. Et aucun échange ne se faisait.

    Par hasard, j'ai réussi à faire fonctionner le tout en ajoutant la ligne :

    serverSocket.setSoTimeout(0); dans le code du client.

    Par contre, j'aurais une autre question :

    j'ai voulu dupliquer le code du client pour avoir deux clients écoutant le même serveur.
    J'ai exactement recopié le code client mais il n'y a toujours qu'un seul client qui veut bien s'ouvrir. Le code semble bloqué à la ligne : ObjectOutputStream out = new ObjectOutputStream(schedulerServer.getOutputStream());

    Que puis-je faire pour avoir plusieurs clients qui écoutent le même serveur ?

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Il te faut plusieurs appel à server.accept() sur le serveur.

    Typiquement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(onContinue){
       Socket s = server.accept();
       ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
       listeDeClients.add(out);
    }

    et dans un autre thread:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for (ObjectOutputStream o : listeDeclients)
       o.writeObject(objet);

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2012
    Messages : 59
    Points : 50
    Points
    50
    Par défaut Re:
    Merci, tout marche parfaitement !

    Bonne soirée

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Web contre client/serveur que choisir??
    Par silvermoon dans le forum Débats sur le développement - Le Best Of
    Réponses: 41
    Dernier message: 24/01/2004, 15h53
  2. Quel outil pour du développement Client/Serveur (Win XP) ?
    Par jey_bonnet dans le forum Débats sur le développement - Le Best Of
    Réponses: 5
    Dernier message: 02/11/2002, 14h57
  3. Réponses: 2
    Dernier message: 01/10/2002, 12h25
  4. comment gerer plusieurs connexions client/serveur
    Par naili dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/08/2002, 16h58
  5. Langage le mieux adapté pour application client serveur ?
    Par guenus dans le forum Débats sur le développement - Le Best Of
    Réponses: 4
    Dernier message: 17/06/2002, 15h46

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