j'ai trouvé ca sur le web :
Je ne sais pas si ca peut aider...Code:
1
2
3 Make sure to create the input stream only after you have written the object(s). Otherwise, if you create the input stream before, you will get this EOF.
Version imprimable
j'ai trouvé ca sur le web :
Je ne sais pas si ca peut aider...Code:
1
2
3 Make sure to create the input stream only after you have written the object(s). Otherwise, if you create the input stream before, you will get this EOF.
En cherchant sur le forum, j'ai trouvé cette discution:
http://www.developpez.net/forums/d18...st-darret-eof/
Apperement ca dois venir de la condition de la boucle while.
Peux-tu redonner l'integralite du code de connectionhandler stp
C'est moi qui te remercie !
ConnectionHandler:
Je vais aller voir le sujet dont tu parles, je ne penses pas que je comprendrais mieux que toi mais on sait jamais j'aurais peut etre un declic :mouarf:Code:
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 import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.ClassNotFoundException; import java.net.Socket; class ConnectionHandler implements Runnable { private Socket socket; private ServerSocketTrain serveur; private Thread t; public ConnectionHandler(Socket socket,ServerSocketTrain serveur) { this.socket = socket; this.serveur=serveur; t = new Thread(this); t.start(); } public void run() { try { //on créé les moyen de communiquer avec le client ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); //de fait on envoie la liste des trains au client //pas certain qu'on puisse directement envoyer un tableau de string //mais on va faire comme si oos.writeObject(serveur.afficherListeTrain()); oos.flush(); Object lecture; while(!socket.isClosed()){ lecture=ois.readObject(); if(lecture instanceof Reservation){ int idTrain=((Reservation) lecture).getIdTrain(); Train train=null; for(int cpt=0;cpt<serveur.getListeTrain().size();cpt++){ if(serveur.getListeTrain().get(cpt).getIdTrain()==idTrain){ train=serveur.getListeTrain().get(cpt); break; } } if(train!=null){ boolean ajout=train.ajouterBillet(((Reservation) lecture).getBillet()); oos.writeBoolean(ajout); oos.flush(); Thread.sleep(100); oos.writeObject(serveur.afficherListeTrain()); oos.flush(); } } } oos.close(); ois.close(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }
ok donc la EOFexception est normale, il faut la gérer.
J'ai modifié le code donc j'envoi toutes les classes:
ClientSocketTrain
ServerSocketTrainCode:
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 import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public class ClientSocketTrain { public static void main(String[] args) { ObjectOutputStream oos=null; ObjectInputStream ois=null; Socket socket=null; String[] tableString=null; Object message=null; try { // Creer une connection avec le socket serveur sur l'application du serveur // A propos ça marche uniquement si les 2 appli tourne sur le meme poste. InetAddress host = InetAddress.getLocalHost(); socket = new Socket(host.getHostName(), 8765); // Envoie un message à l'application serveur (client à l'origine) oos = new ObjectOutputStream(socket.getOutputStream()); oos.writeObject("test"); oos.flush(); ois = new ObjectInputStream(socket.getInputStream()); message= ois.readObject(); // Lit et affiche la réponse du message envoyé par l'application serveur if(message instanceof String[]){ tableString=(String[])message; //et ensuite passer ca dans une boucle for(int cpt=0;cpt< tableString.length;cpt++){ System.out.println(tableString[cpt]); } } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }catch (ClassCastException e) { e.printStackTrace(); //Block finally pour s'assurer que tout est bien fermé }finally{ try{ oos.close(); ois.close(); socket.close(); }catch(IOException ioe){ ioe.printStackTrace(); } } } }
ConnectionHandlerCode:
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.io.IOException; import java.net.ServerSocket; import java.util.ArrayList; public class ServerSocketTrain { private ServerSocket server; private int port = 8765; private ArrayList<Train> listeTrain; public static void main(String[] args) { ServerSocketTrain example = new ServerSocketTrain(); example.handleConnection(); } public ServerSocketTrain() { try { server = new ServerSocket(port); listeTrain=new ArrayList<Train>(); listeTrain.add(new Train(1,"Toulouse",20)); listeTrain.add(new Train(2,"Rouen",10)); listeTrain.add(new Train(3,"Montpellier",30)); listeTrain.add(new Train(4,"Paris",50)); }catch (IOException e) { e.printStackTrace(); } } public void handleConnection() { System.out.println("En attente du message du client..."); // Ici le serveur fait une boucle pour accepter toutes les connections engagées par // l'application cliente. while (!server.isClosed()) { try { new ConnectionHandler(server.accept(), this); } catch (IOException e) { e.printStackTrace(); } } } public String[] afficherListeTrain(){ String[] list=new String[listeTrain.size()]; for(int cpt=0;cpt<listeTrain.size();cpt++){ list[cpt]= listeTrain.get(cpt).afficherTrain(); } return list; } public ArrayList<Train> getListeTrain(){ return listeTrain; } }
TrainCode:
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
71
72
73
74
75
76
77
78
79 import java.io.EOFException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.ClassNotFoundException; import java.net.Socket; class ConnectionHandler implements Runnable { private Socket socket=null; private ServerSocketTrain serveur=null; private Thread t=null; private ObjectInputStream ois=null; private ObjectOutputStream oos=null; private Object lecture=null; private int idTrain=0; private Train train=null; private boolean ajout=false; private boolean hasObject=false; //Constructeur public ConnectionHandler(Socket socket,ServerSocketTrain serveur) { this.socket = socket; this.serveur=serveur; t = new Thread(this); t.start(); } //fonction run du thread public void run() { try{ //on créé les moyen de communiquer avec le client ois = new ObjectInputStream(socket.getInputStream()); oos = new ObjectOutputStream(socket.getOutputStream()); //de fait on envoie la liste des trains au client //pas certain qu'on puisse directement envoyer un tableau de string //mais on va faire comme si oos.writeObject(serveur.afficherListeTrain()); oos.flush(); hasObject=true; while(!socket.isClosed()&& hasObject){ try{ lecture=ois.readObject(); if(lecture instanceof Reservation){ idTrain=((Reservation) lecture).getIdTrain(); for(int cpt=0;cpt<serveur.getListeTrain().size();cpt++){ if(serveur.getListeTrain().get(cpt).getIdTrain()==idTrain){ train=serveur.getListeTrain().get(cpt); break; } } if(train!=null){ ajout=train.ajouterBillet(((Reservation) lecture).getBillet()); oos.writeBoolean(ajout); oos.flush(); oos.writeObject(serveur.afficherListeTrain()); oos.flush(); } }else if(lecture instanceof String){ System.out.println((String)lecture); } }catch(EOFException eof){ hasObject=false; System.out.println("Fin connection du client"); } } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally{ try { ois.close(); oos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
BilletCode:
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 public class Train{ private int idTrain; private String destination; private Billet[] tabBillet; //constructeur de Train public Train(int idTrain,String destination, int nbPlace){ this.idTrain=idTrain; this.destination=destination; tabBillet=new Billet[nbPlace]; } //Fonction pour ajouter un billet au train //elle retourne true si le billet est ajouté, sinon false. //elle est synchronized pour qu'un seul thread puisse l'utiliser en même temps public synchronized boolean ajouterBillet(Billet leBillet){ for(int cpt=0;cpt<tabBillet.length;cpt++){ if(tabBillet[cpt]==null){ tabBillet[cpt]=leBillet; return true; } } return false; } //Fonction pour afficher ton train public String afficherTrain(){ int nbPlaceLibre=0; for(int cpt=0;cpt<tabBillet.length;cpt++){ if(tabBillet[cpt]==null){ nbPlaceLibre=tabBillet.length-cpt; break; } } return "Train N°"+idTrain+",Destination: "+destination+", Nbre place dispo: "+nbPlaceLibre; } //accesseur sur idTrain public int getIdTrain(){ return idTrain; } }
ReservationCode:
1
2
3
4
5
6
7
8
9 public class Billet{ private String nomDuClient; //constructeur de l'objet Billet public Billet(String nomDuClient){ this.nomDuClient=nomDuClient; } }
Bon et la ca marche :ccool:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 import java.io.Serializable; public class Reservation implements Serializable{ private int idTrain; private Billet leBillet; public Reservation(int idTrain, String nomClient){ this.idTrain=idTrain; this.leBillet=new Billet(nomClient); } //accesseurs public int getIdTrain(){ return this.idTrain; } public Billet getBillet(){ return leBillet; } }
Bon il te reste à faire:
- Afficher le nombre de clients connectés: je t'ai donné la solution, reste qu'a l'implementer.
- Ecouter la saisie du client et envoyer une reservation au serveur: je te conseil de regarder la classe scanner dans la javadoc, il faut aussi que tu ajoute la classe reservation du côté client.
- Ecouter la reponse du serveur lorsqu'il repond a une reservation.
- Selon l'ennoncé, il te faut introduire une validation avant d'ajouter un billet au train (l'histoire de commit en 2 phases si j'ai bien pigé)
- le multithreading.... voir le tutorial sur la synchronisation.
Hésite pas si tu as des questions, mais avec ce qu'on a déjà fait et pour peux que tu ai un peu compris ca devrai pas poser trop de souci :mrgreen:
Me revoila lol
J'ai reussi à faire en sorte que l'utilisateur rentre un numéro pour capturer sa demande et l'envoyer au serveur en faisant comme ceci:
Par contre ce que je n'arrive pas à modifier c'est le fait que la liste des trains apparait qu'aprés que l'utilisateur ait saisie son texte.Code:
1
2
3
4
5
6
7 oos = new ObjectOutputStream(socket.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String capture = in.readLine(); oos.writeObject(capture); oos.flush();
Comment puis je modifier ceci ? merci d'avance
faire en sorte que la liste des trains apparaissent directement quand l'utilisateur se connecte, et que la saisie soit demandée aprés l'affichage de la liste
Dans connectionhandler
De plus:Code:
1
2
3
4
5
6
7
8
9 if(train!=null){ ajout=train.ajouterBillet(((Reservation) lecture).getBillet()); oos.writeBoolean(ajout); oos.flush(); //ici je revoi la liste des trains // oos.writeObject(serveur.afficherListeTrain()); // oos.flush(); }
tu renvois un String au serveur, il ne va pas savoir l'interpreter correctement (il devrai juste l'afficher). Par contre si tu envoie un objet Reservation, il va l'interpreter et en plus te repondre true/false.Code:
1
2
3
4
5
6
7 oos = new ObjectOutputStream(socket.getOutputStream()); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String capture = in.readLine(); oos.writeObject(capture); oos.flush();
Attention y a quelque petite modif:
ConnectionHandler
ClientSocketTrainCode:
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
71
72
73
74
75
76
77
78
79 import java.io.EOFException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.lang.ClassNotFoundException; import java.net.Socket; class ConnectionHandler implements Runnable { private Socket socket=null; private ServerSocketTrain serveur=null; private Thread t=null; private ObjectInputStream ois=null; private ObjectOutputStream oos=null; private Object lecture=null; private int idTrain=0; private Train train=null; private boolean ajout=false; private boolean hasObject=false; //Constructeur public ConnectionHandler(Socket socket,ServerSocketTrain serveur) { this.socket = socket; this.serveur=serveur; t = new Thread(this); t.start(); } //fonction run du thread public void run() { try{ //on créé les moyen de communiquer avec le client ois = new ObjectInputStream(socket.getInputStream()); oos = new ObjectOutputStream(socket.getOutputStream()); //de fait on envoie la liste des trains au client //pas certain qu'on puisse directement envoyer un tableau de string //mais on va faire comme si oos.writeObject(serveur.afficherListeTrain()); oos.flush(); hasObject=true; while(!socket.isClosed()&& hasObject){ try{ lecture=ois.readObject(); if(lecture instanceof Reservation){ idTrain=((Reservation) lecture).getIdTrain(); for(int cpt=0;cpt<serveur.getListeTrain().size();cpt++){ if(serveur.getListeTrain().get(cpt).getIdTrain()==idTrain){ train=serveur.getListeTrain().get(cpt); break; } } if(train!=null){ ajout=train.ajouterBillet(((Reservation) lecture).getBillet()); oos.writeObject(new Boolean(ajout)); oos.flush(); oos.writeObject(serveur.afficherListeTrain()); oos.flush(); } }else if(lecture instanceof String){ System.out.println((String)lecture); } }catch(EOFException eof){ hasObject=false; System.out.println("Fin connection du client"); } } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }finally{ try { ois.close(); oos.close(); } catch (IOException e) { e.printStackTrace(); } } } }
BilletCode:
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84 import java.io.EOFException; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class ClientSocketTrain { public static void main(String[] args) { ObjectOutputStream oos=null; ObjectInputStream ois=null; Socket socket=null; String[] tableString=null; Object message=null; boolean hasObject=false; Scanner scan=new Scanner(System.in); String nom=null; int idTrain=0; try { // Creer une connection avec le socket serveur sur l'application du serveur // A propos ça marche uniquement si les 2 appli tourne sur le meme poste. InetAddress host = InetAddress.getLocalHost(); socket = new Socket(host.getHostName(), 8765); oos = new ObjectOutputStream(socket.getOutputStream()); ois = new ObjectInputStream(socket.getInputStream()); // Envoie un message à l'application serveur (client à l'origine) oos.writeObject("test"); oos.flush(); hasObject=true; while(!socket.isClosed() && hasObject){ try{ message= ois.readObject(); // Lit et affiche la réponse du message envoyé par l'application serveur if(message instanceof String[]){ tableString=(String[])message; //et ensuite passer ca dans une boucle System.out.println("Liste des trains:"); for(int cpt=0;cpt< tableString.length;cpt++){ System.out.println(tableString[cpt]); } if(nom==null){ System.out.println("Saisissez votre nom: "); nom=scan.nextLine(); System.out.println(); } System.out.println("Choissez votre train: "); idTrain=scan.nextInt(); oos.writeObject(new Reservation(idTrain,nom)); oos.flush(); }else if(message instanceof Boolean){ if((Boolean)message){ System.out.println("Reservation confirmée."); }else{ System.out.println("Train complet, impossible de reserver une place"); } } }catch(EOFException eof){ hasObject=false; } } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); }catch (ClassCastException e) { e.printStackTrace(); //Block finally pour s'assurer que tout est bien fermé }finally{ try{ oos.close(); ois.close(); socket.close(); }catch(IOException ioe){ ioe.printStackTrace(); } } } }
Pense à ajouter Reservation et Billet dans l'appli cliente.Code:
1
2
3
4
5
6
7
8
9
10
11 import java.io.Serializable; public class Billet implements Serializable{ private String nomDuClient; //constructeur de l'objet Billet public Billet(String nomDuClient){ this.nomDuClient=nomDuClient; } }
Chez moi ca marche :ccool:
C'est parfait ce que tu m'as donné ! C'est exactement ce qu'il me fallait !
Je vais essayer d'ameliorer un peu le programme mais la je pense qu'il est deja bien avancé ;)
En tout cas je ne serais jamais arrivé la sans ton aide.
Je te remercie encore :ccool:
De rien, ca tombé bien parceque là je suis entre 2 projets donc j'ai pas grand chose à faire. Je viens de terminer un projet la dessus sauf que je ne recois pas des objets, mais des octets à traiter...
j'espère que t'as compris... parceque si t'on prof te pose des questions ça risque de poser problème 8O
lol oui je pense avoir compris la base ;)
Je vais prendre le temps de bien regarder ce soir avant de l'envoyer :D
J'ai eu de la chance alors que tu passes dans le coin :)