2012-04-08 13 views
0

クライアントとサーバーの間でオブジェクトのバウンスに問題があります。クライアントサーバーの通信に問題があります

オブジェクトを作成します。いくつかのフィールドを更新してください。サーバーに送信します。 (この部分は作品)右この後、サーバは、さらにいくつかの値を

SomeObject thisObject = new SomeObject(); 
thisObject.setSomeValue(13);   // update object to be sent 

PrintStream toServer = new PrintStream(sock.getOutputStream()); 

ObjectOutputStream oos = new ObjectOutputStream(toServer); 

oos.writeObject(thisObject); 
oos.close(); 

toServer.println(oos);    // send object to server 
toServer.flush(); 

を更新し、1919年に設定します。

ObjectInputStream objFromClient = new ObjectInputStream(new BufferedInputStream(
     sock.getInputStream())); 

Served thisObject = (Served) objFromClient.readObject(); 
thisObject.setSomeValue(1919); 

Serverは、クライアント

toClient = new PrintStream(sock.getOutputStream()); 
ObjectOutputStream oos = new ObjectOutputStream(toClient); 

oos.writeObject(thisObject); 

oos.close(); 
objFromClient.close(); 
sock.close(); 

に戻ってオブジェクトを送信しかし、時間が戻ってクライアント側..にプログラムをオブジェクトを取りに来るときソケットクローズ例外で失敗

ObjectInputStream objFromServer = new ObjectInputStream(
    new BufferedInputStream(sock.getInputStream()));  //java.net.SocketException: Socket is closed 

thisObject = (Served) objFromServer.readObject(); 
.... 

問題を理解してください。

+0

「ソケット」を作成しているコードを表示できますか? –

+0

これはおそらく 'socket sock = new Socket(serverName、SERVER_PORT);' – JAM

+1

と同じくらい簡単です。これはおそらく問題ではありませんが、どうして 'oos.writeObject(thisObject); oos.close(); ' と ' toServer.println(oos);最初のステップでは toServer.flush(); '?あなたは最初の行のペアを必要としませんか? 'PrintStream.println()'はパラメータとして 'ObjectOutputStream'を受け付けることもできますか? –

答えて

2

私はクライアントとの送受信に同じSocketを使用していると思います。クライアント上でObjectOutputStreamを閉じると、基底のOutputStreamが閉じられ、sockが閉じます。次に、下に再利用しようとすると、閉じられて例外がスローされます。

代わりに、クライアントコードでリソースを閉じる前にトランザクションが完了するのを待ちます(途中でfinallyブロックで実行する必要があります)。または、待ちが問題の場合は、新しいSocketを代わりに使用してください。

+0

良いコールポール。これは私が見ている正確な問題のようです。 – JAM

+0

@JAMうれしいよ! –

関連する問題