2012-01-02 4 views
0

私はAndroid用のプログラムを開発中です。SSH経由でサーバに接続してデータを取得しています。サーバが入力を返さないときのInputStream read()ブロック

問題は、コマンドがサーバーに送信されたときに、何も返されない場合(空のファイルにcatなど)、プログラムがハングするように見え、一見in.read()によってブロックされます。

私はライン

if ((read = in.read(buffer)) != -1){ 

とその下のその後/他のライン上にブレークポイントを持っています。私がそれをデバッグすると、プログラムは通常if文でブレークしますが、私がcontinueを押すと、プログラムはちょうど再度ハングし、次のブレークポイントにはなりません。

実際にサーバーから応答を受け取ってもプログラムは正常に動作しますが、サーバーが正しく連携していないと、プログラムがハングしないように保護したいと考えています。

私はJ2SSHライブラリを使用しています。

public String command(String command) { 
    command = command + "\n"; 

    if (session.getSessionType().equals("Uninitialized") || session.isClosed()) { 
     openShell(); 
    } 

    OutputStream out = session.getOutputStream(); 
    InputStream in = session.getInputStream(); 


    byte buffer[] = new byte[255]; 
    int read; 
    String in1 = null; 
    String fullOutput = ""; 

    try { 
     try { 
      out.write(command.getBytes()); 
     } catch (IOException e){ 
      Log.e(TAG,"Error writing IO stream"); 
      e.printStackTrace(); 
     } 
     boolean retrivingdata = true; 
     while (retrivingdata){ 
      String iStreamAvail = "Input Stream Available "+ in.available(); 

      if ((read = in.read(buffer)) != -1){ 
       retrivingdata = true; 
      } else { 
       retrivingdata = false; 
       return null; 
      } 

      in1 = new String(buffer, 0, read); 
      fullOutput = fullOutput + in1; 

      if (read < 255){ 
       break; 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return fullOutput; 
} 
+0

私はこれのdupだと思うhttp://stackoverflow.com/questions/804951/is-it-possible-to-read-from-a-java-inputstream-with-a-timeout –

答えて

0

読み書きは別々のスレッドで行う必要があります。 read()は、サーバからデータが利用できるようになるまで待機するブロッキングメソッドです。

+0

私は実行してもそれは別のスレッドで、そのスレッドはただ応答を待って永遠に続くでしょう。 – coreno

+0

それはソケットの仕組みです。また、タイムアウト後にあなたのトーキングをロックしたい場合は、以下のソケットオプションを見てください:http://developer.android.com/reference/java/net/SocketOptions.html#SO_TIMEOUT – clemp6r

関連する問題