2012-04-16 25 views
0

私はBufferedReaderを持っていますが、読み込もうとするとハングアップして何もしません。私はAsyncTaskでこれを使用しています。非同期タスク、BufferedReader

  • 編集: IをWi-Fiに接続し、タブレットを持っている、これはポート5334上172.20.104.203に放送している私のコンピュータに接続し、私はスレッドが開始したときに見ていないが、それの後に何もすることができます。ここで

私のコード:私はすべての権利の許可または何か、私はAsyncTaskの外にこれをやっていたし、それは完全に働いた、それを移動した

try { 
     final BufferedReader in = new BufferedReader(
     new InputStreamReader(socket.getInputStream()));  
     String line = null; 
     while ((line = in.readLine()) != null) { 
      final String msg; 
      msg = (line); 
      Log.d("DeviceActivity", msg); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e("ClientAcivtity: Exception", 
     String.valueOf(e)); 
    } 
  • EDIT私はメインスレッドでそれを望んでいなかったので。

- を編集してください。完全なコードはここにあります。

public class NetworkTask extends AsyncTask<Void, byte[], Boolean> { 
     Socket nsocket; // Network Socket 
     InputStream nis; // Network Input Stream 
     OutputStream nos; // Network Output Stream 
     private Handler handler = new Handler(); 

     Boolean connected = false; 

     public static final int PORT = 5334; 
     public String SERVERIP = "172.20.104.203"; 

     Socket socket; 

     @Override 
     protected void onPreExecute() { 
      Log.i("AsyncTask", "onPreExecute"); 
      InetAddress serverAddr; 
      try { 
       serverAddr = InetAddress.getByName(SERVERIP); 
       socket = new Socket(serverAddr, PORT); 
       connected = true; 
      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       Log.e("ClientAcivtity: Exception", String.valueOf(e)); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       Log.e("ClientAcivtity: Exception", String.valueOf(e)); 
      } 
     } 

     @Override 
     protected Boolean doInBackground(Void... params) { // This runs on a 
                  // different thread 
      boolean result = false; 

      try { 

       Log.d("ClientActivity", "C: Connecting..."); 
       if (socket != null) { 
        int cont = 1; 
        while (cont == 1) { 
         try { 
          Log.d("ClientActivity", "C: Sending command."); 
          PrintWriter out = new PrintWriter(
            new BufferedWriter(new OutputStreamWriter(
              socket.getOutputStream())), true); 
          // where you issue the commands 
          out.println("getPos"); 
          Log.d("ClientActivity", "C: Sent " + "getPos"); 

         } catch (Exception e) { 
          Log.e("ClientAcivtity: Exception", 
            String.valueOf(e)); 
         } 
         try { 
          final BufferedReader in = new BufferedReader(
            new InputStreamReader(
              socket.getInputStream())); 
          String line = null; 
          while ((line = in.readLine()) != null) { 
           final String msg; 
           msg = (line); 
           Log.d("DeviceActivity", msg); 
          } 
         } catch (Exception e) { 
          e.printStackTrace(); 
          Log.e("ClientAcivtity: Exception", 
            String.valueOf(e)); 
         } 
         cont--; 
        } 

        Log.d("ClientActivity", "C: Closed."); 
       } 
      } catch (Exception e) { 
       Log.e("ClientAcivtity: Exception", String.valueOf(e)); 
      } 

      return result; 
     } 

     @Override 
     protected void onProgressUpdate(byte[]... values) { 
      if (values.length > 0) { 
       Log.i("AsyncTask", "onProgressUpdate: " + values[0].length 
         + " bytes received."); 
      } 
     } 

     @Override 
     protected void onCancelled() { 
      Log.i("AsyncTask", "Cancelled."); 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
      if (socket != null) { 
       if (connected) { 
        if (result) { 
         Log.i("AsyncTask", 
           "onPostExecute: Completed with an Error."); 
         try { 
          socket.close(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } else { 
         Log.i("AsyncTask", "onPostExecute: Completed."); 
         try { 
          socket.close(); 
         } catch (IOException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     } 
    } 
+0

相手側には何がありますか? readlineの問題は、ソケットが切断されるか、新しい行が送信されるまで、それが返されないことです。 – MByD

+0

私のフルコードが欲しいですか? – FabianCook

+0

フルコードではなく、コミュニケーションの真髄です。 – MByD

答えて

0

マイ推測であるあなたが(根本的なBufferedWriterが、実際に回線上のデータを送信していないコマンド「GetPosも」を書き出すときにすべきことこれをtcpdump/wiresharkで確認してください)。この場合、サーバーはコマンドを受け取っていないので、readLine()に応答しません。この申し立てを確認するには、の後にout.flush();を追加してください。

本当に、tcpdumpは、フォーラムの誰かより良い回答を与えるでしょう。

も参照してください。http://developer.android.com/reference/java/io/BufferedWriter.html

+0

おかげで、私は問題が何であるかを知った、それは愚かな間違いでしたが、あなたの答えは、私はあなたを見て、getPosの前に$を持っていないことに気づいた私はコンピュータのサイトに接続しているデバイスは、コマンドの前に、愚かなばかげた私、感謝の前に必要 – FabianCook

0

このようにそれをやってみてください。

final BufferedReader in = new BufferedReader(new InputStreamReader(
                socket.getInputStream())); 
StringBuffer buf = new StringBuffer(); 
int i; 
while((i = in.read()) != -1){ 
    buf.append((char) i); 
} 

String data = buf.toString(); 
+0

から出ますその後、私はあなたが作成する必要がありますね – FabianCook

+0

申し訳ありませんが、おかげで作業しているように見えるdoesntのストリーム内のデータを継続的にリスンするスレッド – waqaslam

+0

私はそのメッセージを送った後、一度だけ聞きたい、返信はすぐにすべきです。 – FabianCook

0

は、ソケットからの読み込みは、ソケットが実際に接続されており、どのように他側が応答した場合によっては非常に困難な問題です。

反対側が非常に速い場合、読み取りルーチンが実際に正常に動作するように、十分なデータをソケットに提供することができます。しかし、何らかの種類の相手側に遅延がある場合(ちょっとしたデフォルトのタイムアウトを含む読み込みルーチンよりも遅くする必要がある)、反対側のデータがあるかもしれないにもかかわらず読み込みに失敗します。ちょっと遅すぎますソケットで。

必要に応じて、読み取りルーチンの周りに独自の最小タイマーと最大タイマーをラップすることができます。

さらに詳しい情報をご提供ください。問題をよりよく理解してください。

多くの場合、相手側がデータをソケットにプッシュするのに十分な大きさの最小タイムアウトを設定する必要がありますが、実際にデータが到着するのを待つ時間の最大値が必要な場合もあります。

UPDATE:

最初の実行可能な監視スレッドを開始します。ループ内でmonitoringCanRunを使用して、必要に応じてスレッドを中断することができます。そして、monitoringThreadIsAliveは、スレッドがまだ実行中かどうかを知るために使用できます。

monitoringCanRun = true; 
    new Thread(new Runnable() { 
    public void run() { 
     monitoringThreadIsAlive = true; 
     performMonitoring(); 
     monitoringThreadIsAlive = false; 
    } 
    }).start(); 
} 

とperformMonitoringは、次のようになります。

public void performMonitoring() { 
while (monitoringCanRun) { 
    ... do your read in the while loop 
    ...you might like to insert some delay before trying again... 
    try { //we delay every partial read so we are not too fast for the other side 
    Thread.sleep(100); 
    } catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
} 

} 
+0

Wi-Fiに接続されたタブレットがあります。これは、ポート5334の172.20.104.203でブロードキャストしているコンピュータに接続しています。それ以降は何もない。 – FabianCook

+0

try.ready() - >このストリームが読み込み可能かどうかを調べます。バッファリングされた文字ストリームは、バッファが空でない場合、または基礎となる文字ストリームが準備が整っている場合に準備ができています。 – user387184

+0

ifステートメント?または、他の何か?それはif文であれば完全にスキップしないからです。 – FabianCook

関連する問題