2016-03-28 12 views
0

かなり長い間この問題を解決しようとしましたが、最終的には専門家の助けを借りて決定しました。ソケットプログラミングを使用してサーバークライアントアプリケーションを開発しました。クライアントはサーバーに正常に接続できます。今私は、クライアントからの要求に基づいてサーバからソケットを介してオブジェクトを送信しようとしていますが、私のサーバは要求をキャッチすることができますが、サーバが送信した応答(writeObject(...))はクライアントに到達できません。

Serverのコードスニペット:クライアントがObjectStream over Javaによって送信されたオブジェクトを受信して​​いません

ServerSocket sSocket = new ServerSocket(socketNumber); 
ArrayList<LoginPassword> logIn = new ArrayList<>(); 
Socket cSocket = sSocket.accept(); 
ObjectOutputStream outputStream = new ObjectOutputStream(cSocket.getOutputStream()); 
outputStream.flush(); 
ObjectInputStream inputStream = new ObjectInputStream(cSocket.getInputStream()); 
LoginPassword lp1 = new LoginPassword("admin","admin"); 
logIn.add(lp1); 
outputStream.writeObject(logIn); 
outputStream.flush(); 

Clinetコードスニペット:送信されたデータを検出することができないので私の場合は

Socket client = new Socket(InetAddress.getLocalHost(),socketNumber); 
ArrayList<LoginPassword> myList = new ArrayList<>(); 
ObjectOutputStream outputStream = new ObjectOutputStream(client.getOutputStream()); 
outputStream.flush(); 
ObjectInputStream inputStream = new ObjectInputStream(client.getInputStream()); 
//Wait untill the data is available 
myList = (ArrayList<LoginPassword>) inputStream.readObject(); 

、クライアントはのreadObject()が呼び出されることはありませんServer.Anyヘルプでお願いします。

+0

何も読んでいないので、なぜサーバー上でInputStreamを開きますか?クライアントと同じです:何も書いていないので、なぜあなたはOutputStreamを開きますか? –

+0

これは私の問題を説明するためのコードスニペットです。アプリケーションの実行中に前後にデータを送信するために、クライアント側とサーバー側の両方でinputStreamとOutputStreamを使用しています。 – Rambo772

+0

最初に削除してください。コードが正常に動作するはずです。次に、それらを再導入しますが、正しい順序で最初に読み込まれるクライアントは、入力ストリームを最初に開き、読み取ってから書き込む必要があります。最初に書き込むサーバーは、出力ストリームを最初に開き、入力ストリームを書き込み、次に開く必要があります。 –

答えて

0

ObjectOutputStreamを最初に、好ましくは両端に作成する必要があります。その他の場合は、デッドロックが発生してObjectInputStreamが作成されます。

代わりに私は、次のコメントの意味が何であるかを知りたいだろう:

// Wait untill the data is available 

これはちょうどそれを削除し、available()を呼び出す不足しているコードの一部を示している場合。 は必要なだけ正確にブロックされます。 available()の正しい使用法はほとんどありません。これはその1つではありません。

+0

OMGそれは最高です。私はメッセージを待っているavailable()を持っていましたが、それを削除して直接readObject()を呼び出すと完全に機能しました。さて、この実装の後、もう一つの質問があります。これを行うと、応答が受信されなくなるまでブロックされますが、データが見つからない場合、サーバーが応答を送信しないことがあります。待機時間が経過した後のreadObject() – Rambo772

+0

'Socket.setSoTImeout()'で読み取りタイムアウトを設定し、結果として生じる 'SocketTimeoutException'をキャッチします。 – EJP

+0

ありがとう@EJP、私はそれをテストし、それは魅力のように動作します。本当に助けに感謝します。 – Rambo772

関連する問題