J'essaie de créer une classe dans laquelle je peux sérialiser et désérialiser un objet. La classe devrait fonctionner de la manière suivante: je sérialise l'objet et l'envoie au serveur, puis le serveur modifie un champ de mon objet et le renvoie afin que je puisse désérialiser l'objet reçu. Mais si je ferme le outputStream j'obtiens l'erreur d'écriture de douille. Comment puis-je fermer correctement outputStream et inputStream?Manière correcte de fermer ObjectInputStream et ObjectOutputStream
EDIT: Même si j'utilise essayer avec-ressources, je reçois toujours la même erreur
public class UtilSerialize {
InetAddress address;
Socket socketConnection;
public UtilSerialize() {
try {
this.address = InetAddress.getLocalHost();
socketConnection = new Socket(address, 8000);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void serializeObject() {
try {
OrdinaryUser user = new OrdinaryUser("Joe", "Joe");
ObjectOutputStream clientOutputStream = new ObjectOutputStream(socketConnection.getOutputStream());
clientOutputStream.writeObject(user);
System.out.println(user.getUsername());
//clientOutputStream.close();
} catch (Exception e) {
System.out.println(e);
}
}
public void deSerializeObject() {
try {
ObjectInputStream clientInputStream = new ObjectInputStream(socketConnection.getInputStream());
OrdinaryUser user = (OrdinaryUser) clientInputStream.readObject();
System.out.println(user.getUsername());
clientInputStream.close();
} catch(Exception e)
{
e.printStackTrace();
}
}
}
C'est l'exception que je reçois et il est dans le côté serveur .
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 ro.unitbv.serverinvoicemanagement.classes.ServerThread.run(ServerThread.java:29)
at java.lang.Thread.run(Unknown Source)
La méthode correcte serait [try-with-resources] (http://stackoverflow.com/q/26516020/6948900) –
Etes-vous sûr de vouloir 'close()' et pas seulement 'flush()' pour éviter de fermer le flux sous-jacent? –
il doit vider puis fermer le flux. C'est juste une pratique sûre – efekctive