1

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) 
+1

La méthode correcte serait [try-with-resources] (http://stackoverflow.com/q/26516020/6948900) –

+0

Etes-vous sûr de vouloir 'close()' et pas seulement 'flush()' pour éviter de fermer le flux sous-jacent? –

+0

il doit vider puis fermer le flux. C'est juste une pratique sûre – efekctive

Répondre

0

Vous pouvez le mettre dans un bloc finally:

public void deSerializeObject() { 
    ObjectInputStream clientInputStream = null; 

    try { 
     clientInputStream = new ObjectInputStream(socketConnection.getInputStream()); 
     OrdinaryUser user = (OrdinaryUser) clientInputStream.readObject(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } finally { 
     clientInputStream.close(); 
    } 

} 
0

Mais si je ferme la outputStream j'obtiens l'erreur d'écriture de socket.

Pourquoi voulez-vous le faire?

ici:

ObjectOutputStream clientOutputStream = new ObjectOutputStream(socketConnection.getOutputStream()); 

la variable clientOutputStream fait référence à la outputstream de la prise.
Si vous le fermez, vous fermez le socket.

Il est la même chose ici:

ObjectInputStream clientInputStream = new ObjectInputStream(socketConnection.getInputStream()); 

la variable clientInputStream fait référence à la inputstream de la prise.
Si vous le fermez, vous fermez le socket.

Bien que le socket soit requis en lecture/écriture, vous ne devez pas fermer les flux associés.
Sinon le socket ne serait plus dans un état utilisable et les opérations de lecture/écriture sur le socket échoueraient.

+1

Mais quand j'ai fini de lire/écrire, comment puis-je fermer les flux? –