2017-11-30 7 views
0

最初にreadLine()を呼び出してデータを待つことなく、InputStreamバッファに読み込みと出力が可能なデータが含まれているかどうかを確認します。クライアントのソケットInputStreamにデータが含まれているかどうかを確認するにはどうすればよいですか?

私はavailable()に見てきましたが、それは常に出力0

 while (true) 
    { 
     fromServer = in.readLine(); //Causing a hang waiting for reply 
     System.out.println(fromServer); 

     if ((fromUser = stdIn.readLine()) != null) 
     { 
      out.println(fromUser); 
      fromServer = in.readLine(); 
      System.out.println(fromServer); 
     } 
    } 
+0

達成しようとしていることは何ですか?あなたはあなたのプログラムについていくつかの情報を提供できますか?いくつかのソースコードですか?おそらく回避策があります。 –

+0

私は駐車場管理システムを開発しようとしています。自動車が進入しようとしているが、駐車場がいっぱいのときに待ち行列が形成される。このキューのメンバーは、車が終了すると削除されます。問題はreadLineクライアントにアクセスが許可されていない場合にクライアントがサーバーの応答にぶら下がってしまうようにする –

答えて

-1

BufferedInputStreamの新しいインスタンスを作成し、そのオブジェクト上で利用可能呼び出すと、これは動作していないようでした:

InputStream is = ...; 
BufferedInputStream bis = new BufferedInputStream(inputStream); 
if (bis.available() == 0) { 
    // do sth if input is available 
} 

私は少しのサーバークライアントアプリケーションで試してみましたが、それは私のために働いていました。

EDIT:タイプが不一致になりました。 Javaドキュメントでは、InputStream.available()は常にがゼロを返します。それに比べて、実装されている場合にBufferedInputStream戻っ「the number of bytes remaining that can be read in the bufferは」

+0

'BufferedInputStream'は以前にゼロを返す' available() 'メソッドを作るという魔法の特性を持っていません。 – EJP

+0

型の不一致があり、intをブール値 –

+0

に変換できません。1. 'InputStream'は抽象クラスです。 'Socket.getInputStream()'によって返される 'InputStream'はそうではなく、ゼロを返さずに' available() 'を実装することができます。 2.部分的に引用された 'BufferedInputStream.available()'の*完全なドキュメントは、 'available()'メソッドによって返されたものとバッファに残っているバイト数を返します。そのネストされたストリーム。あなたが投稿したコードでは、 'BufferedInputStream'は一度も読み込まれていないので、最初はバッファに何もないので、OPの問題を魔法のように解決するわけではありません。 – EJP

0

available()は、あなたに利用できるバイトの数を伝えるかもしれませんが、何もそれを読み取ろうとする以外、完全ラインがあるかどうかを伝えることはできません。

あなたは別のスレッドで読む必要があります。

問題はreadLine()です。クライアントにアクセスが許可されていない場合、クライアントはサーバー応答でハングします。

だから、問題は、むしろ何もしないよりも、そう言うすなわちメッセージのアクセスがクライアントに許可されていない場合は、 '、サーバーが何かを送信する必要があり、本当にということです。ブロッキングI/Oシステムでは、メッセージが存在しないことをメッセージとして使用することはできません。

また、を確認する必要があります。readLine() nullの結果が得られます。ソケットを読み取るときにそれを閉じる必要があります。

+0

実際にクライアントにアクセスが許可されていない場合、なぜサーバーは接続を開いたままにしていますか? – EJP

関連する問題