1

オブジェクトを直列化および逆シリアル化できるクラスを作成しようとしています。クラスはこのように動作するはずです。オブジェクトをシリアル化してサーバーに送信し、サーバーがオブジェクトの1つのフィールドを変更して戻して、受け取ったオブジェクトを逆シリアル化できます。しかし、私がoutputStreamを閉じると、ソケット書き込みエラーが発生します。 outputStreamとinputStreamを正しく閉じるにはどうすればよいですか?ObjectInputStreamとObjectOutputStreamを閉じる正しい方法

編集:私はトライして、リソース使用 場合でも、私はまだこれは私が取得しています例外はある

同じエラー

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(); 
    } 
} 

}を取得し、それはサーバ側にあります。

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

正しい方法は[try-with-resources](http://stackoverflow.com/q/26516020/6948900) –

+0

'close()'と 'flush()'だけではないですか?基礎となるストリームを閉じないようにするには? –

+0

彼はフラッシュしてからストリームを閉じる必要があります。 – efekctive

答えて

0

あなたは、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

しかし、私はOutputStreamを閉じた場合、私は、ソケットの書き込みエラーが発生します。

なぜあなたはそれをしたいですか?

ここ:

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

clientOutputStream変数は、ソケットのOutputStreamに指します。
これを閉じると、ソケットが閉じます。 clientInputStream変数は、ソケットの入力ストリームを指し

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


ここは同じものです。
これを閉じると、ソケットが閉じます。

読み込み/書き込みにソケットが必要ですが、関連するストリームを閉じることはできません。
それ以外の場合、ソケットはもはや使用可能な状態にはなく、ソケットの読み取り/書き込み操作は失敗します。

+1

しかし、私が読み書きを終えたら、どうすればストリームを閉じることができますか? –

関連する問題