2017-02-21 4 views
0

JavaでBufferedReaderを囲むwhileループを使用する際に問題が発生しています。私はソケットでいくつかの実験をしています。BufferedReaderを使用してWhileループでスタックするには

私の現在のコード:

InetAddress address = InetAddress.getByName(this.IP); 
     SocketAddress socketaddress = new InetSocketAddress(address, this.port); 
     Socket socket = new Socket(); 
     socket.connect(socketaddress); 

     if(socket.isConnected()){ 

      Executor.logger.info("Connection to proxy established!"); 

     } 
     else { 

      Executor.logger.warning("Connection to proxy failed!"); 
      socket.close(); 
      return; 

     } 

     BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     String temp2; 
     while((temp2 = in.readLine()) != null){ 

      Executor.logger.info("Running query says " + temp2); 

     } 

は、しかし、私はコードを試してきたものに関係なく次の行に進まないだろう。私のロガーを何かで迷惑をかけることはありません。突然停止してしまいます。

これはクライアント側のみであり、受信側のサーバー側を制御していません。

何か間違っていますか?

ご協力いただきありがとうございます。

編集

サーバーは、あなたがちょうど何をしたかの結果を伝えるコードを変数とリターンとのコマンドを受け付け、コマンド・ラインです。しかし、最初に接続すると、メッセージ、空白行、メッセージ、空白行のようなものが返りますが、これは現在ループが止まっています。

+0

データを待っているので、 'readLine()'で*ブロックします。 'readLine()'は 'null'を返しませんが、データが入っていないので、データが到着するのを待っています。おそらくサーバーは、より多くのデータを返すまであなたからの入力を待っています。また、データを受信して​​同時にデータを送信できるように、ライター用に別のスレッドが必要です。 – Kayaman

+0

BufferedReaderが空のときに検出する方法はありますか?私はコンストラクタの内部に基づいて進歩するコードが必要です。 – Harieo

+0

DataFetcherのようなスレッド・リスナーを使用する必要があります。https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/io/DataFetcher.java – ControlAltDel

答えて

0

私は、BufferedReaderがいっぱいかどうかを検出するために使用できる代替変数を見つけました。

あなたは、このコードから((TEMP2 = in.readLine())=ヌルを!)に変更した場合:

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

    String temp2; 
    while((temp2 = in.readLine()) != null){ 

     Executor.logger.info("Running query says " + temp2); 

    } 

し、代わりに(()in.ready)ブール値を使用します。

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     out.write("login " + this.user + " " + this.password); 
     out.flush(); 

     String temp2; 
     while(in.ready()){ 

      temp2 = in.readLine(); 

      Executor.logger.info("Running query says " + temp2); 

     } 

BufferedReadで読み取るデータがなくなったときにループを停止し、必要に応じてループを再度コピーして再度初期化することができます。

+0

完全な行が使用できない場合、これはまだブロックされます。 – EJP

+0

入力がなく書かれているという私のテストはうまくいくようで、コードはスキップします。メソッドは次のようになります: "このストリームが読み込み可能かどうかを知らせます。バッファが空でない場合、バッファリングされた文字ストリームが準備できています..." – Harieo

+0

ネットワークIOを正しく行う方法を知るためにネットワークチュートリアルを読むことをお勧めします。これは、特定のケースであなたを動かせるかもしれないとしても、正しい方法ではありません。あるいは、間違った方法を学ぶことができますし、将来的にはバグに遭遇することもあります。 – Kayaman

関連する問題