Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de désérialisation

StreamCorruptedException: invalid stream header : ...

    16 janvier 2011 à 22:29:03

    Bonjour tout le monde !

    Je vous expose mon problème. Dans le cadre d'un projet je dois réaliser une communication client/serveur. Pour les besoins de l'application, j'ai besoin que le serveur broadcast un object (via sérialisation donc) à tous les clients connectés.
    Cependant lors de la réception de l'objet, il arrive que j'obtienne l'Exception suivante :
    StreamCorruptedException: invalid stream header : ...
    Les ... représentant un nombre qui varie, surement le numéro du stream en question je suppose.

    Je dis bien "il arrive", car l'exception n'arrive jamais au même moment. Des fois elle arrive dès le premier broadcast, des fois au bout du 5ème, du 7ème enfin bref je n'ai remarqué aucune régularité, mise à part le fait qu'elle survient tout le temps au bout d'une certaine durée (même en espaçant les broadcasts).

    Au niveau architecture logicielle, côté serveur j'ai un Thread dédié au broadcast, et un Thread d'écoute.
    Côté client j'ai un thread d'écoute.

    Thread de broadcast (juste le run()):
    try{
        while(true)
        {
            SendMapThread.sleep(500);
    
            try {
                _instanceServer.sendMapToAll();
            } catch (IOException ex) {
                //...
            }
        }
    
    } catch (InterruptedException ex) {
    }
    


    senMapToAll :
    ObjectOutputStream  oos;
    PrintWriter         pw;
    OutputStream        os;
    
    for (int i = 0; i < tabClients.size(); i++)
    {
        if (tabClients.get(i).isConnected())
        {
            os  = tabClients.get(i).getOutputStream();
            pw  = new PrintWriter(os, true);
    
            System.out.println("Sending Map");
            pw.println("Map");
    
            oos = new ObjectOutputStream(os);
            oos.writeObject(gameElt);
            System.out.println("Map send");
        }
    }
    


    Thread d'écoute serveur :
    try
    {
        while (clientConnected)
        {
            receivedMsg = _in.readLine();
    
            //Traitement du message reçu
        }
    
    } catch (Exception e) {
        //...
    }
    finally
    {
        //...
    }
    


    Et pour finir mon Thread d'écoute client : == Exception obtenue à la ligne 9 du code suivant !! ==
    try
    {
        while (connected)
        {
            receivedMsg = in.readLine();
    
            if("Map".equals(receivedMsg))
            {
                inObject = new ObjectInputStream(s.getInputStream());
                _main.setGameElt( (GameInfo) inObject.readObject() );
            }
        }
    } catch (Exception e) {
        //...
    } finally {
        //...
    }
    


    J'ai effectué des recherches et je suis tombé sur : http://www.javamex.com/tutorials/io/St [...] ception.shtml
    Le hic c'est qu'en testant la 1ère solution, c'est à dire en mettant un oos.close(); dans ma méthode sendMapToAll, j'ai le droit à un jolie SocketException : Socket Closed dans mon Thread d'écoute serveur au niveau de :
    receivedMsg = _in.readLine();
    Quant à la deuxième solution proposé, je le fait déjà dans mon code.

    Bref je suis assez perdu, et je ne vois pas bien ce que je pourrais faire d'autre.
    Je vous remercie d'avance pour votre aide !
    • Partager sur Facebook
    • Partager sur Twitter

    Problème de désérialisation

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown