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

Langage Java Discussion :

InputStream et flux


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut InputStream et flux
    Bonjour,

    J'ai des soucis avec mes flux ObjectInputStream. J'écris sur le flux par ObjectOutputStream.writeInt(7); mais mon ObjectIntputStream.readInt(); ne le reçoit pas.

    Voici mon code. Je commence par le client qui s'est, au préalable, connecté sur le serveur. L'envoie et la réception du login par les flux fonctionne très bien dans ce cas là. Ensuite mon client lance un object requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Req Requete = new Req("GET_INFO", cliSock, Dest, Date);
    Cet objet s'initialise fort bien et c'est lui qui fait le write:

    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 Req(String Requete, Socket soc, String Dest, String Date){
            Re = Requete;
            s = soc;
            da = Date;
            de = Dest;
     
            try
            {
               // ois= new ObjectInputStream(s.getInputStream());
               //PS: il ne veut pas mon ois!!!
                oos= new ObjectOutputStream(s.getOutputStream());
            }
            catch(IOException e)
            {
                System.err.println("Erreur IO:"+e.getMessage());
            }
            catch(Exception e)
            {
                System.err.println("Erreur Flux:"+e.getMessage());
            }
     
            if(Re.equalsIgnoreCase("GET_INFO")==true)
            {
                System.out.println("Tajmaps: Get Info");
     
                try{
                    //Voici l'envoi qui fonctionne très bien.
                    oos.writeInt(5);oos.flush();
                }        
                catch(Exception e)
                {
                    System.err.println("Erreur Tajmaps:"+e.getMessage());
                }
            }        
            else
                System.out.println("Perdu");
        }
    Mon serveur, après le login du client s'est mis en attente sur un read:

    Et il attend... Il attend, il attend, et il attend tjs...
    Pourquoi ne se rend-t-il pas compte que qqch a été écris. Les flux son initialisé sur la même socket.

  2. #2
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    Je viens d'écrire une librairie permettant de communiquer simplement des objets JAVA typiquement entre un client et un serveur.

    En l'utilisant, tu pourrais écrire quelque chose ressemblant à ceci:

    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
        private EventDispachThread edt     = null;
        private IOSession          session = null;
     
        /** Creates a new instance of Main */
        public Main() {
             try {
                 createNetworkService();
             }
             catch(Exception e) {
                 // Do job
             }
     
             this.session = connectToServer();
             if( this.session == null ) {
                 // Do Job
             }
     
             Req requete = new Req("GET_INFO", dest, date); 
     
             /** Create a tool class for using synchronous communication (blocking reads)
              */
             Conversation conversation = new Conversation(this.session);
     
             /** Send the request (asynchronous write)
              *  This method returns a Future for tracking task (and cancelation purpose)
              */
             conversation.write( requete );
     
             /** Wait the response (blocking reads)
              */
             try {
                 Object response = conversation.read();
             }
             catch(InterruptedException ie) {
                 // Do Job
             }
     
             /** Close the conversation tool (but not the underlying session)
              *  NB: If the session is closed by the peer, this conversation will be closed also automatically
              */
             conversation.close();
     
             /** Close the session
              */
             this.session.close();
     
             /** Stop the service
              */
             this.edt.stop();
             this.edt = null;
        }
     
        /** Create a network Service
         */
        private void createNetworkService() throws NotStartedException {
            if( this.edt != null ) throw new IllegalStateException("Service already started");
     
            /** Start a network service (as client mode)
             */
            this.edt = EventDispachThread.start();
        }
     
        /** Connect to the server
         */
        private IOSession connectToServer() {
     
            if( this.edt == null ) throw new IllegalStateException("Service must be started");
     
            return this.edt.connect( InetAddress.getByName("you.server.ip") , 4555 );
        }
    Si cela t'interresse, tu peu consulter cette page : http://code.google.com/p/objectserver/

  3. #3
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    Merci.
    Mais ce que je ne comprends pas c'est que je fais la même que dix lignes plus haut et là ça fonctionne très bien.

  4. #4
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut
    J'ai trouvé mon erreur.
    J'utilise mes ObjectOutput/InputStream dans trois fichiers. Et je les réinitialisais dans les trois fichiers. Je me suis débrouillé pour passer le flux à ma requête afin de ne pas devoir le réinitialiser et ça fonctionne très bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Req Requete = new Req("GET_INFO", cliSock, Dest, Date, MON_FLUX);
    Ce qui donne donc:

    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
     
    public Req(String Requete, Socket soc, String Dest, String Date, ObjectOutputStream MON_FLUX){
            Re = Requete;
            s = soc;
            da = Date;
            de = Dest;
     
            if(Re.equalsIgnoreCase("GET_INFO")==true)
            {
                System.out.println("Tajmaps: Get Info");
     
                try{
                    //Voici l'envoi qui fonctionne très bien.
                    MON_FLUX.writeInt(5);MON_FLUX.flush();
                }        
                catch(Exception e)
                {
                    System.err.println("Erreur Tajmaps:"+e.getMessage());
                }
            }        
            else
                System.out.println("Perdu");
        }

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

Discussions similaires

  1. InputStream et fermeture de flux
    Par Mides dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 19/06/2012, 11h54
  2. Réponses: 17
    Dernier message: 20/02/2011, 23h20
  3. Rediriger un flux de données sous linux
    Par Nicaisse dans le forum POSIX
    Réponses: 7
    Dernier message: 01/07/2003, 16h04
  4. Copie d'un flux dans un autre
    Par Morvan Mikael dans le forum Langage
    Réponses: 5
    Dernier message: 03/06/2003, 09h40
  5. [reseaux] redirection de flux
    Par Olive1808 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 12/08/2002, 09h24

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