2011-08-08 12 views
0

さらに別のJavaの問題 パッシブモードでサーバーに接続するクライアントがあります。 それはうまくいくようです、私はIPアドレスとポートを取得し、passivesocketは準備ができていると言います。javaのパッシブftp - なぜストリームが準備できていないのですか

しかし、passivesocket.getInputStreamはまったく準備ができていないので、私はそれを読むことができず、LISTへの応答は得られません。 なぜ、任意の提案を把握することはできませんか?

public synchronized void getPasvCon() throws IOException, InterruptedException { 

     // Commands abholen 


     // IP Adresse holen 
Thread.sleep(200); 
     String pasv = commands.lastElement(); 
     String ipAndPort = pasv.substring(pasv.indexOf("(") + 1, 
       pasv.indexOf(")")); 

     StringTokenizer getIp = new StringTokenizer(ipAndPort); 

     // holt die IP 
     String ipNew = ""; // IP für den neuen Socket 
     for (int i = 0; i < 4; i++) { 
      if (i < 3) { 
       ipNew += (getIp.nextToken(",") + "."); 
      } else { 
       ipNew += (getIp.nextToken(",")); 

      } 
     } 


     Integer portTemp1 = new Integer(getIp.nextToken(",")); 
     Integer portTemp2 = new Integer (getIp.nextToken(",")); 
     portNew = (portTemp1 << 8)+ portTemp2; 

System.out.println(">>>>> " + ipNew + ":" + portNew);  


     try { 

      pasvSocket = new Socket(ipNew, portNew); 
      System.out.println("Socket verbunden: "+ pasvSocket.isConnected()); 

     } catch (UnknownHostException e) { 
      System.out.println("Host unbekannt"); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      fromPasvServer = new BufferedReader(new InputStreamReader(
        pasvSocket.getInputStream())); 
      Thread.sleep(2000); 
      System.out.println("Streams bereit: " + fromPasvServer.ready() + " | "); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      writePasvCommands = new PrintWriter(pasvSocket.getOutputStream(), 
        true); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


Thread.sleep(3000); 
     Thread pasvKonsole = new Thread(new PasvKonsole(this)); 

     pasvKonsole.start(); 

    } 

    public void LIST() throws IOException { 
    writeCommands.print("LIST\n"); 
    writeCommands.flush(); 

    } 


    public void run() { 
     try { 
      connect(); 

    //  getStatus(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      USER(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     PASS(); 


     try { 
      Thread.sleep(2000); 
      PASV(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


import java.io.IOException; 


public class PasvKonsole extends Thread { 
    Client client; 
    public PasvKonsole(Client client) { 
     this.client = client; 
    } 

    public void run() { 
     System.out.println("========= PasvKonsole started"); 

    while(true) { 

     try { 

      String lineP = client.fromPasvServer.readLine(); 
       System.out.println("***" + lineP); 
       System.out.println("Ich bin da und tue auch was"); 
     } catch (IOException e) {} 

    }  
    } 
} 
+0

私は実際にコードを理解していません。 'Thread pasvKonsole = new Thread(new PasvKonsole(this));とは何ですか?あなたは '非マルチスレッド'の世界でそれを試しましたか? – home

+0

whoops、これはコメントアウトする必要があります。このスレッドは、受信した応答をサーバーから出力する必要があります。 – ABLX

+0

'getPasvCon'で' LIST'を呼び出すことはありませんか? – home

答えて

0

Thread.Sleepを追加しました。

+0

これは正しい方法ではありません**!ほとんどの場合** ready()を呼び出す必要はありません。そして、それが返すものに依存します。非常に特殊な場合にのみ使用されます。 *通常は 'read()'を呼び出し、データが利用可能になるのを待つだけです。 'Thread.sleep'を追加するのはタイミングの悪い、タイミングの遅い回避策です。遅いネットワークで実行するとすぐに中断されます(高速ネットワークで実行している場合は不要にアプリケーションが遅くなります)。一般的に:ネットワークコードに 'Thread.sleep()'がたくさん必要な場合は、間違っています! –

+0

@ joahim-sauerどのようにあなたはthread.sleepなしで待つことをお勧めしますか? "通常は、read()を呼び出してデータが利用可能になるのを待ってください。" – husayt

関連する問題