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 :

Sérialisation avec sockets


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 11
    Points : 16
    Points
    16
    Par défaut Sérialisation avec sockets
    Hello!

    j'essaie de simuler un échange client-serveur à travers les sockets, et ce en utilisant la sérialisation. Je dois faire qqch de faux dans la transmission de mon objet, parce que quand je veux lire depuis le serveur un objet envoyé par le client, c'est comme si l'objet (en l'occurence un tableau de byte) n'existait pas.

    La classe d'échange entre le client et 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
     
    import java.util.*;
    import java.io.*;
     
            public class Echange implements Serializable {
     
    	private byte[] test;
     
    	public void setTest(byte[] testTable) {
    		this.test = testTable;
    	}
     
    	public byte[] getTest() {
    		return test;
    	}
    }
    Le client, qui émet un objet à destination 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
    import java.io.*;
    import java.net.*;
    import java.security.*;
    import java.security.spec.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import java.util.*;
     
     
    public class DHClient {
    	public static void main(String[] args) throws Exception {
     
        	Echange transfert = new Echange();
     
            //la connexion entre le serveur est le client a été initialisée. Le but est maintenant de transmettre ce tableau de bytes au serveur.
            byte[] testNumber = new byte[150];
            testNumber[0] = 4;
            transfert.setTest(testNumber);
            System.out.println("nb test = " + transfert.getTest()[0]);
            out.writeObject(transfert);
    Le code du serveur, censé réceptionné le tableau du 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
    import java.security.spec.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import java.util.*;
     
    public class DHServer {
    	public static int port = 8080;	
     
     
    	public static void main(String[] args) throws Exception {
     
            Echange transfert = new Echange();
     
    // la connexion a été créée
    byte[] test = new byte[10];
    System.out.println("valeur test = " + transfert.getTest()[0] );
    C'est ce dernier bout qui pose problème. Il ne doit pas reconnaître l'objet puisqu'il donne une "NullPointerException"... ce n'est pas un problème de socket ou de connexion, parce que des variables envoyées seules passent sans problème. C'est bien la sérialisation qui pose problème, j'ai l'impression... quelqu'un peut-il m'aider?

    D'avance, merci à lui!

    Sébastien

  2. #2
    Membre confirmé

    Inscrit en
    Juillet 2002
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 116
    Points : 514
    Points
    514
    Par défaut
    Popur pouvoir t'aider, il nous manque des informations dans le code que tu nous as fournis ...

    le code de Echange me paraît conforme ...
    le code de DHClient me parait aussi complet , en partant du principe que la variable "out" est un ObjectOutputStream lié au flux de sortie de ta socket ...

    Par contre, le code DHServer est trop incomplet, on ne voit null part de "in.readObject()" pour lire le flux d'entrée de la socket ..

    Pourrais t'on avoir une version de DHServer plus explicite ?

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 11
    Points : 16
    Points
    16
    Par défaut
    Oups, en effet, à trop vouloir rendre le code lisible, je l'ai trop épuré... la classe Echange reste inchangée, mais je la remets par souci de lisibilité:

    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
     
    import java.util.*;
    import java.io.*;
     
    public class Echange implements Serializable {
     
       private byte[] test;
     
       public void setTest(byte[] testTable) {
           this.test = testTable;
       }
     
       public byte[] getTest() {
          return test;
       }
    }
    Pour DHClient, out est en effet un ObjectOutputStream, déclaré comme suit (le reste ne change pas):

    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
     
    import java.io.*;
    import java.net.*;
    import java.security.*;
    import java.security.spec.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import java.util.*;
     
     
    public class DHClient {
       public static void main(String[] args) throws Exception {
     
       //addr et DHServer.port sont préalablement définis
       Socket s = new Socket(addr, DHServer.port);
       ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
     
       Echange transfert = new Echange();
     
       //la connexion entre le serveur est le client a été initialisée. Le but est maintenant de transmettre ce tableau de bytes au serveur.
       byte[] testNumber = new byte[150];
       testNumber[0] = 4;
       transfert.setTest(testNumber);
       System.out.println("nb test = " + transfert.getTest()[0]);
       out.writeObject(transfert); 
       }
    }
    Pour DHServer:

    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
     
    import java.security.spec.*;
    import javax.crypto.*;
    import javax.crypto.spec.*;
    import java.util.*;
     
    public class DHServer {
     public static void main(String[] args) throws Exception {
     
       Echange transfert = new Echange();
     
       //attends la connexion
       ServerSocket ss = new ServerSocket(port);
       System.out.println("Started: " + ss);
       Socket s = ss.accept();
       ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
       ObjectInputStream in = new ObjectInputStream(s.getInputStream());
     
       transfert = (Echange)in.readObject();
     
       byte[] test = new byte[10];
       System.out.println("valeur test = " + transfert.getTest()[0] ); 
     }
    }
    Voilà, j'espère que cette fois c'est plus compréhensible!

    Sébastien

  4. #4
    Membre confirmé

    Inscrit en
    Juillet 2002
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 116
    Points : 514
    Points
    514
    Par défaut
    J'ai repris les sources que tu m'as donné et les ai modifié pour en cela :
    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
     
    import java.io.*; 
    import java.net.*; 
    import java.util.*; 
     
    public class DHClient { 
       public static void main(String[] args) throws Exception { 
     
       //addr et DHServer.port sont préalablement définis 
       Socket s = new Socket(args[0], Integer.parseInt(args[1])); 
       ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); 
     
       Echange transfert = new Echange(); 
     
       //la connexion entre le serveur est le client a été initialisée. Le but est maintenant de transmettre ce tableau de bytes au serveur. 
       byte[] testNumber = new byte[150]; 
       testNumber[0] = 4; 
       transfert.setTest(testNumber); 
       System.out.println("nb test = " + transfert.getTest()[0]); 
       out.writeObject(transfert); 
       } 
    }
    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
     
    import java.net.*;
    import java.util.*; 
    import java.io.*;
     
    public class DHServer { 
     public static void main(String[] args) throws Exception { 
     
       Echange transfert = new Echange(); 
     
       //attends la connexion 
       ServerSocket ss = new ServerSocket(Integer.parseInt(args[0])); 
       System.out.println("Started: " + ss); 
       Socket s = ss.accept(); 
       ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); 
       ObjectInputStream in = new ObjectInputStream(s.getInputStream()); 
     
       transfert = (Echange)in.readObject(); 
     
       byte[] test = new byte[10]; 
       System.out.println("valeur test = " + transfert.getTest()[0] ); 
     } 
    }
    et le source de Echange identique au tien ...

    Puis, aprés avoir compilé, j'ai executé le code en tapant les lignes suivantes sur 2 consoles différentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java DHServer 6000
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java DHClient 127.0.0.1 6000
    et je n'ai obtenu aucune exeception ... voici la sortie des 2 résultats obtenus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Started: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=6000]
    valeur test = 4
    Peut tu essayer le même exemple que moi pour voir si tu as des disfonctionnements ou pas ?
    Si tu n'en as pas, cela signifie que ton erreur ne vient pas de cette portion de code ...
    Enfin peut tu nous donner l'exception compléte que tu as, c'est à dire le StackTrace ?

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2003
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 11
    Points : 16
    Points
    16
    Par défaut
    J'ai recopié ton code et changé/rajouté petit à petit ce qu'il me fallait et ça marche maintenant! Merci bien!

    Sébastien

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

Discussions similaires

  1. [POO] Sérialiser Objet PHP avec Socket
    Par Invité4 dans le forum Langage
    Réponses: 8
    Dernier message: 30/11/2007, 11h37
  2. Problème avec Socket et/ou Telnet sur le manager d'Asterisk
    Par gorby69 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 21/07/2006, 14h47
  3. Aide avec socket connection
    Par Micheal1221 dans le forum C++Builder
    Réponses: 8
    Dernier message: 06/07/2006, 13h18
  4. Pb avec socket - too many open files
    Par be_tnt dans le forum Réseau
    Réponses: 16
    Dernier message: 17/05/2006, 10h46
  5. pb avec socket
    Par claude294 dans le forum MFC
    Réponses: 2
    Dernier message: 16/01/2004, 20h40

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