Bonjour,


Mon but : créer un objet "image" a sérialiser pour ensuite l’envoyer depuis un client à un serveur qui a comme rôle de désérialiser l'objet "image" et d'y exploiter les infos qui se trouvent à l'intérieur.

Le client et le serveur possèdent tous les deux la même classe Photo implements serializable qui permet serialiser et désérialiser l'objet.
L'objet Photo est constitué : d'une String nom, d'une String annotation, d'un Boolean visible et d'un tableau de bytes qui doit contenir l'image à proprement parler
Première chose : ai je le droit de créer un objet contenant un tableau de bits qui servira à reconstituer l'image envoyée et à la copier sur le disque du serveur ?

Bref, donc apparemment le client envoie bien tout ce qu'il faut, mais le serveur me lance à chaque fois une exception que voici :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
IO Exception
projet_server.Connexion run
java.io.EOFException
        at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)
        at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
        at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
        at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
        at projeti4b_server.Connexion.run(Connexion.java:47)
Voici le début de la classe Photo présente chez le serveur et le client (le package doit être le même chez les 2 sinon ça marche pas, est ce normal ??) :

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
package projet_client;
 
import java.io.Serializable;
 
public class Photo implements Serializable{
    private String nom="";
    private String annotation="";
    private Boolean visible=false;
    private byte[] file;
 
    public Photo(){
        this.file=null;
        this.nom="";
        this.annotation="";
        this.visible=null;
    }
 
    public Photo(byte[] b,String nm, String annot, Boolean ok){
        this.file=b;
        this.nom=nm;
        this.annotation=annot;
        this.visible=ok;
    }

Voici la classe Client qui est utilisée par une JFrame :

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
 
package projet_client;
 
import java.io.*;
import java.net.*;
 
public class Client{
    static final int port=8080;
    static final String ip="localhost";
    private String chemin_p;
    private Photo Ph;
    private PrintWriter out;
    private BufferedReader in;
    Socket socket;
 
    public Client() throws Exception{
        socket = new Socket(ip,port);
    }
 
    public void EnvoiPhoto(String path, String annot, Boolean visib) throws Exception{
 
                chemin_p = path.substring(path.lastIndexOf("\\"));
                chemin_p = chemin_p.substring(1,chemin_p.length());
 
 
        	out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);
                in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
 
 
                FileInputStream photo = new FileInputStream(path);
                byte[] octets = new byte[photo.available()];
                Ph=new Photo(chemin_p,annot,visib);
                ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                oos.writeObject(Ph);
                oos.flush();
                oos.close();
                photo.close();
 
 
		System.out.println("SOCKET "+socket);
		System.out.println("Image envoyee");
 
                //str=in.readLine();
 
    }
 
    public void Close() throws Exception{
        socket.close();
        out.close();
	in.close();
    }

Voici ensuite le code Connexion 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
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
package projet_server;
 
 
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
 
 
public class Connexion extends Thread{
    private GestionPhotos Gp;
    private Socket socket;
    private BufferedReader in;
    private PrintWriter out;
    private int nb=0;
 
    public  Connexion(Socket s) throws IOException {
        socket=s;
        Gp=new GestionPhotos();
        in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
 
        out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
 
        start();
    }
 
    public synchronized void run() {
        try {
 
          while (true) {
 
                if(nb>=20)
                    out.println("trop d'images, veuillez en supprimer");
                else{
 
                    ObjectInputStream flux=new ObjectInputStream(socket.getInputStream());//apparemment c'est là que ça cafouille
                    try {
 
                        projeti4b_client.Photo photoC = (projeti4b_client.Photo) flux.readObject();
                    } catch (ClassNotFoundException ex){
                        Logger.getLogger(Connexion.class.getName()).log(Level.SEVERE, null, ex);
                    }
 
//Je ne mets pas le reste de cette méthode puisque l'exception est lancée dès la première ligne
 
                }
        }
        } catch(IOException e) {
 
          System.err.println("IO Exception");
          Logger.getLogger(Connexion.class.getName()).log(Level.SEVERE, null, e);
        } finally {
          try {
            socket.close();
            in.close();
            out.close();
          } catch(IOException e) {
            System.err.println("Socket not closed");
          }
        }
    }
}


Quelqu'un saurait où sont mes erreurs ???
Merci !!