Bonjour,
Je tente désespérément d'envoyer par socket à la fois du texte (par un PrintWriter) et des objets (ObjectOutputStream).
Voilà un bout de code du client (attention, c'est plein de variables mais leur type est correct, l'erreur ne vient pas de là) :
J'ai plusieurs questions :
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 Socket sock = new Socket(Parametres.IP_SERVER, Parametres.PORT_SOCKET); BufferedReader is = new BufferedReader(new InputStreamReader(sock.getInputStream())); PrintWriter os = new PrintWriter(sock.getOutputStream(), true); //Envoi de l'info de départ pour identifier le document à générer os.print("CreationEtatSection" + "\r\n"); //Envoi des informations générales os.print(_parent._cboSection._mapCodeLibelle.get(_section).toString() + "\r\n"); os.print(_user._nom + "\r\n"); os.print(_grade + "\r\n"); os.print(nbSemaines + "\r\n"); os.print(nbAgents + "\r\n"); //Envoi des dates à afficher GregorianCalendar dateEnCours = new GregorianCalendar(dateDebut.get(Calendar.YEAR), dateDebut.get(Calendar.MONTH), dateDebut.get(Calendar.DATE)); for (int i = 0; i < nbSemaines * 7; i++) { int mois = dateEnCours.get(Calendar.MONTH) + 1; os.print(Outils.afficheDate(dateEnCours.get(Calendar.DATE)) + "/" + Outils.afficheDate(mois) + "\r\n"); dateEnCours.add(Calendar.DATE, 1); } os.flush(); //Envoi des activités jour après jour pour chaque agent ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream()); oos.writeObject(data); oos.writeObject(_actis); oos.writeObject(_cookColor); oos.writeObject(_parent._cboActis._mapCodeLibelle); oos.flush(); oos.close(); os.close(); sock.close();
1/ Pourquoi fermer os puis ouvrir oos provoque la fermeture de la socket (erreur du type : socket closed) ? On parle bien d'un flux et pas de la socket à proprement parler ?
2/ Quand j'effectue 2 fois de suite se code, même après avoir fermé la socket et l'avoir réouverte, je prends, côté client, l'erreur suivante :
La ligne 300 est le premier writeObject : writeObject(data)java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at tempo.FeuilleSection.genererPage(FeuilleSection.java:300)
Côté serveur, voilà le message :
Celui-là correspond, côté serveur à ois = new ObjectInputStream(clientSocket.getInputStream());java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at tempo.TempoServer.traiter(TempoServer.java:314)
at tempo.TempoServer.main(TempoServer.java:87)
Je suis un peu perdu dans ce qu'il faut ouvrir, et fermer, et quand.
Merci de votre aide,
ced
Partager