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

Applets Java Discussion :

[Applet]Transfert d'objet serialisé applet/servlet


Sujet :

Applets Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [Applet]Transfert d'objet serialisé applet/servlet
    Bonjour.

    Voilà mon problème :

    Je tente de faire communiquer une applet et une servlet. Après quelques recherches sur le net, je suis parvenu à transférer une chaîne de caractères. Cependant, je désirerais transférer une image.
    Je sais que les images ne sont pas sérialisables. J'ai donc effectué un pixelgrabber. (J'ai trouvé une explication sur le net).

    Maintenant, je me trouve face à une erreur :
    java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2435)
    ...

    Voici le code que j'utilise dans mon applet :


    public void rec (Image imaret) throws IOException
    {
    immod=imaret;

    try
    {
    URL url = new URL("http://monadresseip:8080/examples/servlet/enreg");
    HttpURLConnection con = (HttpURLConnection)url.openConnection();
    con.setUseCaches(false);
    con.setDoOutput(true);

    ObjectOutputStream out3 = new ObjectOutputStream(con.getOutputStream());

    if ( con instanceof HttpURLConnection && ((HttpURLConnection)con).getResponseCode () / 100 == 4) throw new IOException ();
    System.out.println("Connection OK!");
    int i = ((HttpURLConnection)con).getResponseCode();
    System.out.println(i);

    PixelGrabber grabber = new PixelGrabber(immod, 0,0, -1, -1, true);
    try
    {
    grabber.grabPixels();
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }

    Object pix = grabber.getPixels();
    Dimension dim = new Dimension(((BufferedImage)immod).getWidth(),((BufferedImage)immod).getHeight());

    out3.writeObject(dim);
    //out3.writeObject(pix);

    out3.flush();
    out3.close();

    BufferedReader entrée = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String message = entrée.readLine();

    System.out.println("truc : "+message);

    }
    catch(IOException e) {System.out.println("problème à l'ouverture de la connexion sur l'URL ");}

    }



    Et le code de ma servlet :


    public class enreg extends HttpServlet implements Serializable
    {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
    try
    {
    ObjectInputStream in = new ObjectInputStream(request.getInputStream());

    String ok = "Connection ok";

    PrintWriter sortie = response.getWriter();
    sortie.println("Connection effective");

    System.out.println("REUSSI!");
    Dimension dim = (Dimension)in.readObject();
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }

    }
    }


    J'ai simplifié le code ici car de toute façon, ça bloque au niveau du in.readObject()... Apparemment, le flux que j'essaie de transmettre est vide...

    Si quelqu'un a une idée pour résoudre mon problème, je suis preneur.

    Merci d'avance!

    Fanou28.







    [Modéré par Didier]
    Ajout de tag dans le titre
    Lire les règles du forum : Règles du forum Java

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Points : 409
    Points
    409
    Par défaut
    j'nez pas compris tout ton PB mais ....
    ke ve tu transferer de koi vers koi ?

    tu ne peux pas passer l'adresse http de ton image ? ou si tu veux récupérer un contenu binaire ans ta servlet essaye getReader() .....

    cordialement

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour taska.

    C'est vrai, je me rend compte que je ne suis pas très clair... Désolé...

    Le projet global consiste à gérer un album photo via internet. J'upload des images, elles sont stockées sur le serveur et leurs adresses sont enregistrées dans une base de données afin de pouvoir les afficher sur une page html mais également de pouvoir les retoucher dans une applet.

    En fait, je veux transférer un élément de type Image d'une applet vers une servlet...
    Il s'agit de l'applet de retouche d'image. J'essaye de faire en sorte qu'un utilisateur puisse enregistrer son image retouchée sur le serveur. L'applet va bien récupérer une image via son adresse http dans la base de données, mais ensuite, je travaille avec des bufferedImage et Image pour faire les retouches...

    Je sais qu'un élément de type Image n'est pas serialisable. C'est pourquoi j'emploie un Pixelgrabber.

    Je transfère (en tout cas, j'essaie...) ensuite les dimensions de l'objet Image ainsi que la valeur de chaque pixel dans un ObjectOutputStream.
    Et, normalement, je peux récupérer ces infos dans ma servlet via un ObjectInputStream puis readObject().

    Mais c'est sur ce dernier point que ça bloque... Apparemment, rien n'est transmis à la servlet...


    Comme tu peux le voir, il m'est impossible de passer l'adresse http car il ne s'agit pas d'une image à proprement parler...

    Par contre, je ne sais pas si un getReader() pourrait marcher... Je vais voir.

    En tout cas, je te remercie pour ta réponse.
    J'espère être un peu plus clair cette fois-ci...

    Cordialement,

    Fanou28.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Points : 409
    Points
    409
    Par défaut
    chez pas si c'est une solution , je n'l'ais pas testée mais essaie de ce coté la!
    restriction . l'image est en gif mais ce format doit pouvoir être modifié.

    L'idée est d'enregistrer sur disque l'image modifiée de ton applet et ensuite tu n'auras aucun pb pour la relire.

    ceci est un pt'it bout de code à adapter ...
    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
     
    import java.awt.image.*;
    import java.awt.image.BufferedImage;
    import java.io.*;
     
    ....
     
    	    // Note - use TYPE_BYTE_INDEXED for color .gifs
    	    //
    	    BufferedImage bi = new BufferedImage(Chart_width, Chart_height, BufferedImage.TYPE_BYTE_INDEXED);
    	    Graphics2D g2 = bi.createGraphics();
     
    	    // For file encoding
    	    PieCh.drawBuffer(g2); 
     
    	    EncodeGifFile(bi, "samplegif.gif");
     
     
    	} catch (ChartException e) 
    	    {
    		System.out.println(e.getMessage());
    	    }
     
    	f.show();
     
     
        }
     
     
     
        //
        // Encode a gif file
        //
        public static void EncodeGifFile(BufferedImage bi, String filename) 
        {
    	FileOutputStream out = null;
     
            try {
     
    	    File file = new File(".", filename);
    	    out = new FileOutputStream(file);
     
    	} catch (java.io.IOException e) {
    	    System.err.println("Cannot create ./" + filename);
    	    System.exit(1);
    	}
     
     
    	try {
     
    	    GIFEncoder encoder = new GIFEncoder(out);
    	    encoder.encode(bi);
     
    	} catch (java.io.IOException e) {
    	    System.err.println("I/O exception");
    	    System.exit(1);
    	}
     
     
        }

    Bon courrage .

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour taska.

    En fait, il me semble que la création d'un fichier chez le client est impossible au travers d'une applet... Mais je n'en suis pas sûr... Peut-être qu'en signant l'applet...

    En fait, après différent tests, je m'aperçois que, chez moi, tous les flux passent excepté objectoutputstream...

    J'aimerai évité d'obligé le client à créer l'image sur son disque... Mais si je n'arrive pas à résoudre ce problème d'objectoutputstream, j'essaierai ta solution.

    Merci pour ton aide.

    Fanou28

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 349
    Points : 409
    Points
    409

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour taska!

    Merci pour le temps que tu as passé sur le sujet.

    Je suis finalement parvenu à mes fin. J'ai utilisé objectoutputstream.

    Pour ceux que ça interesse, voici le source de l'applet (enfin... La partie interessante) :


    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
     
     
    public void rec (Image imaret) throws IOException, ClassNotFoundException
        {
        		Image immod=imaret;
     
        		try
        		{
        		//Remplacer http://adresseip/servlet par vos propres paramètres   		    		
        		URL url = new URL(http://adresseip/servlet);
        		HttpURLConnection con = (HttpURLConnection)url.openConnection();
    	   	con.setUseCaches(false);
       		con.setDoOutput(true);
       		con.setUseCaches (false);
    		con.setDefaultUseCaches (false);
    		con.setRequestProperty( "Content-type ", "application/x-java-serialized-object "); 
     
     
    	   	ObjectOutputStream out3 = new ObjectOutputStream(con.getOutputStream());
     
     		PixelGrabber grabber = new PixelGrabber(immod, 0,0, -1, -1, true);
    	    	try
        		{
        			grabber.grabPixels();
        		}
    	    	catch (InterruptedException e)
        		{
        			e.printStackTrace();
    	    	}
     
        	    	Object pix = grabber.getPixels();
        	    	BufferedImage bufferedImage = new BufferedImage( immod.getWidth(null), immod.getHeight(null), BufferedImage.TYPE_INT_RGB );
        	    	int Height = bufferedImage.getHeight();
        	    	int Width = bufferedImage.getWidth();
     
        	    	Dimension dim = new Dimension(Width,Height);
     
      		//Avec ça, je passe le nom de mon image en même temps : out3.writeObject(nom_image);
        		out3.writeObject(dim);
        		out3.writeObject(pix);
    	    	out3.flush();
     
        		}
        		catch(IOException e) {System.out.println("problème à l'ouverture de la connexion sur l'URL "); e.printStackTrace();}
     
    }
    N'oubliez pas d'importer :
    import java.net.URL;
    import java.net.*;

    et implements Serializable



    Ensuite, dans la servlet, il suffit de récupérer les objets (attention à l'ordre d'envoi!) par readOject() :

    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
     
     
    import java.lang.*;import java.io.*;
    import javax.servlet.*;import javax.servlet.http.*;
    import java.util.*;
    import java.awt.*;
    import javax.swing.*;
    import java.net.*;
     
    import java.awt.image.*;
    import java.awt.image.MemoryImageSource;
    import java.awt.event.*;
    import com.sun.imageio.plugins.png.*;
    import com.sun.image.codec.jpeg.*;
     
     
    public class enreg extends HttpServlet implements Serializable
    {
                    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
                 {
     
                    try
                    {
                        //à mettre si vous envoyez aussi le nom de votre fichier : String nom_image=(String)in.readObject();
                        Dimension dim = (Dimension)in.readObject();
                        int [] pix=(int[])in.readObject();
     
                        Canvas can = new Canvas();
                        MemoryImageSource mis = new MemoryImageSource(dim.width, dim.height, pix, 0, dim.width);
                        Image bimg2=can.createImage(mis);
                        BufferedImage bimg = new BufferedImage(bimg2.getWidth(null),bimg2.getHeight(null),BufferedImage.TYPE_INT_RGB);
                        int w = bimg.getWidth();
                        int h = bimg.getHeight();
                        bimg.setRGB(0,0,w,h,pix,0,w);
     
                        File file = new File("votre nouveau fichier jpg");
                        FileOutputStream fout = new FileOutputStream(file);
                        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(fout);
                        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimg);
     
                        //On peut changer le paramètre 0.85f
                        //Il s'agit de la compression
                        //Si vous mettez 1.0f, il n'y a pas de compression mais votre fichier risque d'être assez gros
                        param.setQuality(0.85f, false);
                        encoder.setJPEGEncodeParam(param);
                        encoder.encode(bimg);
                        fout.close();
                        }
                        catch(ClassNotFoundException e)
                       {e.printStackTrace();}
                     }
    }

    Bon. J'espère que je n'ai pas fait d'erreur en recopiant mon code car j'ai beaucoup d'autres choses autour... Enfin, ça, c'est ce qui est utile pour le passage d'objets avec Image entre applet et servlet.


    Et encore merci taska.


    Cordialement,

    Fanou28

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par fanou28 Voir le message
    Bonjour.

    Voilà mon problème :

    Je tente de faire communiquer une applet et une servlet. Après quelques recherches sur le net, je suis parvenu à transférer une chaîne de caractères. Cependant, je désirerais transférer une image.
    Je sais que les images ne sont pas sérialisables. J'ai donc effectué un pixelgrabber. (J'ai trouvé une explication sur le net).

    Maintenant, je me trouve face à une erreur :
    java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2435)
    ...

    Voici le code que j'utilise dans mon applet :


    public void rec (Image imaret) throws IOException
    {
    immod=imaret;

    try
    {
    URL url = new URL("http://monadresseip:8080/examples/servlet/enreg");
    HttpURLConnection con = (HttpURLConnection)url.openConnection();
    con.setUseCaches(false);
    con.setDoOutput(true);

    ObjectOutputStream out3 = new ObjectOutputStream(con.getOutputStream());

    if ( con instanceof HttpURLConnection && ((HttpURLConnection)con).getResponseCode () / 100 == 4) throw new IOException ();
    System.out.println("Connection OK!");
    int i = ((HttpURLConnection)con).getResponseCode();
    System.out.println(i);

    PixelGrabber grabber = new PixelGrabber(immod, 0,0, -1, -1, true);
    try
    {
    grabber.grabPixels();
    }
    catch (InterruptedException e)
    {
    e.printStackTrace();
    }

    Object pix = grabber.getPixels();
    Dimension dim = new Dimension(((BufferedImage)immod).getWidth(),((BufferedImage)immod).getHeight());

    out3.writeObject(dim);
    //out3.writeObject(pix);

    out3.flush();
    out3.close();

    BufferedReader entrée = new BufferedReader(new InputStreamReader(con.getInputStream()));
    String message = entrée.readLine();

    System.out.println("truc : "+message);

    }
    catch(IOException e) {System.out.println("problème à l'ouverture de la connexion sur l'URL ");}

    }



    Et le code de ma servlet :


    public class enreg extends HttpServlet implements Serializable
    {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
    try
    {
    ObjectInputStream in = new ObjectInputStream(request.getInputStream());

    String ok = "Connection ok";

    PrintWriter sortie = response.getWriter();
    sortie.println("Connection effective");

    System.out.println("REUSSI!");
    Dimension dim = (Dimension)in.readObject();
    }
    catch(Exception e)
    {
    e.printStackTrace();
    }

    }
    }


    J'ai simplifié le code ici car de toute façon, ça bloque au niveau du in.readObject()... Apparemment, le flux que j'essaie de transmettre est vide...

    Si quelqu'un a une idée pour résoudre mon problème, je suis preneur.

    Merci d'avance!

    Fanou28.

    pour fanou28 tu me rends un grand service si tu me dis comment faire pour faire une servlet qui intégre une applet pack j'ai troiuvé dans le net.svp c urgent





    [Modéré par Didier]
    Ajout de tag dans le titre
    Lire les règles du forum : Règles du forum Java

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

Discussions similaires

  1. Applet RMI initialisation objet
    Par debloc dans le forum Applets
    Réponses: 0
    Dernier message: 21/07/2011, 13h15
  2. Reception dans une applet de données provenant d'une servlet
    Par blaz dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 08/03/2011, 19h01
  3. applet telecharge un fichier depuis la servlet ?
    Par rimas2009 dans le forum Applets
    Réponses: 0
    Dernier message: 17/06/2009, 11h35
  4. Réponses: 4
    Dernier message: 02/01/2005, 23h24
  5. [ applet ] signer et utiliser une applet
    Par felix79 dans le forum Applets
    Réponses: 4
    Dernier message: 17/06/2004, 16h47

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