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 les ObjectInputStream et ObjectOutputStream


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut Probleme avec les ObjectInputStream et ObjectOutputStream
    Bonjour

    je realise une application de messagerie instantanéé en utilisant les socket. Coté serveur je crée donc un thread pour permettre plusieurs connexions simultanées mais dans ce thread lorsque j'instantie les flux d entrée et sortie le programme s arrête sans mettre d 'erreur

    voici le code :

    classe Server :

    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
     
     
    import java.net.*;
    import java.io.*;
    import java.util.*;
     
     
    public class Server {
     
    	static final int port = 8080;
    	static Map<String,ServerThread> map = new HashMap();
    	static Vector<client>vect = new Vector();
     
     
    	public static void main (String [] args){
     
     
     
    		try{
     
    			ServerSocket srv = new ServerSocket(port);
    			System.out.println("Démarré " + srv);
     
     
    			while (true){
     
    				Socket conect = srv.accept();
    				System.out.println("Connexion accepté : " + conect);
    				new ServerThread (conect, num++).start();		
              }finally{
     
    				System.out.println("closing...");
     
    				soc.close();
     
    			}
    		}finally{
     
    			srv.close();
    la classe ServerThread :

    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
    
    public class ServerThread extends Thread {
    
    	private Socket conect;
    	protected boolean fini;
    	private int num;
    	String msgp,msg;
    
    	ObjectInputStream reception;
    	ObjectOutputStream envoi;
    	String dest, exp;
    	Iterator it = Server.vect.iterator();
    	
    	public ServerThread(Socket conect, int num){
    		
    		this.conect=conect;
    		this.num=num;
    		fini=false;
    		
    		
    	}
    
    public void run (){
    		
    		try{
                        
                        reception = new ObjectInputStream(conect.getInputStream());
    
                           System.out.println("initialisation de 'reception' ");
    			reception=new ObjectInputStream(conect.getInputStream());
    			System.out.println("'reception' initialisé ");
                            client c1 = (client)reception.readObject();  
          
                      }catch (Exception e){
    			
    			System.out.println(e);
    			
    		}
    		
    		
    		
    	}

    et la classe client (je ne pense pas quelle soit necessaire pour mon probleme mais je la mais quand meme on sait jamais):



    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
     
     
    public class client  {
     
    	Socket soc;
    	protected String pseudo;
    	//BufferedReader entree;
    	//PrintWriter sortie;
    	ObjectInputStream entree;
    	ObjectOutputStream sortie;
    	String msg;
     
    	public client (String pseudo){
     
    		this.pseudo=pseudo;
    		Server.vect.add(this);
         }
     
     
         public void connexion() throws IOException{
     
     
    		try{
     
    		InetAddress ip = InetAddress.getByName("192.168.1.36");
    		//
    		System.out.println("Adresse ip du serveur : " + ip);
    		soc = new Socket (ip, Server.port);
     
    			System.out.println("Socket : " + soc);
    			entree = new ObjectInputStream(soc.getInputStream());
    			sortie = new ObjectOutputStream(soc.getOutputStream());
     
    			sortie.writeObject(this);
                    }catch (Exception e) {
     
    			e.printStackTrace();
     
     
    		}
    	}
    Le probleme se situe dans la classe ServerThread dans la partie en gras.

    En fait ligne "initialisation de 'reception" s affiche bien
    puis après plus rien. Par contre lorsque je met en comentaire les 2 lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    reception=new ObjectInputStream(conect.getInputStream());
     
                            client c1 = (client)reception.readObject();[/B]

    la ligne "'reception 'initialisé'" s affiche bien.

    Est ce que quelqu'un saurait d'ou sa peut venir?

    merci

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    je dirais que l'envoie de "l'objet" vers le server foire, vu le nombre de choses non sérialisable qui se trouvent derrière ton this. D'ailleurs, je me demande bien pourquoi tu essaie d'envoyer au serveur tes classes clients! Si par malheur ça devait réussir, tu te retrouverais avec des classes client coté serveur, un truc totalement inutilisable

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Points : 53
    Points
    53
    Par défaut
    commence par enlever une des 2 ligne ou tu alloue reception
    et passe par un object aussi ça sera peu être plus simple.
    autre chose ton serveur doit recevoir en continu des objet et ne pas s'arrêter au 1er enfin dans ton cas je pense

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try{
      while(true)
      {
          System.out.println("initialisation de reception ");              
          reception = new ObjectInputStream(conect.getInputStream());
          System.out.println("reception initialisé ");
          Object c1 = reception.readObject();
      }    
    }
    catch (Exception e){System.out.println(e);}

    a part ça ton code m'a l'air pas mal

  4. #4
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    Effectivement je n avais pa vu ke j instanciait 2 fois reception! je ne peux pas tester aujourd'hui mais je pense que ca vientde la !!

    merci

  5. #5
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    Enfet le probleme venait du fait que je declarais le flux d entree avant le flux de sortie. il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    envoi       = new ObjectOutputStream(conect.getOutputStream());
    reception = new ObjectInputStream(conect.getInputStream());
    En revanche, maintenant j ai une erreur java.io.notSerializableException coté client. Je suis debutant en java donc je ne comprends pas vraiment ce que ca veut dire. J ai cherché sur le net il dise qu'il faut implémenter Serializable (ce que j'ai fais) mais toujours une erreur de notSerializable.

    Quelqu'un pourrait me dire comment serialiser ma classe client ou alors m indiquer un tuto?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    pour qu'une classe soit sérializable, il faut qu'elle implémente Serializable et que tous ses champs soient sérializables. En l'occurence, dans ton cas, les champs suivant sont non sérializables:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Socket soc
    ObjectInputStream entree;
    ObjectOutputStream sortie;
    pour les tutoriaux une petite recherche sur les tutoriaux de developpez en java et tu trouvera ton bonheur.

  7. #7
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 141
    Points : 66
    Points
    66
    Par défaut
    comment je peux faire alors pour envoyer mon objet sachant qu'il contient les 3 champs precedemment cités?

    Est ce que c 'est possible?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    non.

    De toutes facons, la sérialisation n'est pas destinée aux communication client serveur. C'est destiné à sauver, dans un stream, l'état d'un certains nombre d'objets pour le récupérer après. De plus si t'envoie le meme objet 2 fois, il ne sera écrit d'un fois, les changement postérieur coté émetteur ne se répercuretont pas coté destinataire

Discussions similaires

  1. Help!! Probleme avec les dates sur SQL SERVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 03/08/2006, 17h55
  2. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 14h26
  3. [langage] probleme avec les listes dans des listes
    Par pqmoltonel dans le forum Langage
    Réponses: 7
    Dernier message: 27/04/2004, 13h32
  4. Problem avec les *.AVI sur les panels
    Par NaDiA_SoFt dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/08/2003, 23h50
  5. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 01h18

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