java中的被动ftp-为什么流没有准备好

java中的被动ftp-为什么流没有准备好,java,networking,ftp,Java,Networking,Ftp,还有一个java问题。。。 获取了一个客户端,该客户端应通过被动模式连接到服务器。 它似乎工作得很好,我得到了ip地址和端口,被动时钟说它准备好了 但是被动式socket.getInputStream根本没有准备好,所以我无法从中读取,也无法得到列表的响应。 不知道为什么,有什么建议吗 public synchronized void getPasvCon() throws IOException, InterruptedException { // Commands abho

还有一个java问题。。。 获取了一个客户端,该客户端应通过被动模式连接到服务器。 它似乎工作得很好,我得到了ip地址和端口,被动时钟说它准备好了

但是被动式socket.getInputStream根本没有准备好,所以我无法从中读取,也无法得到列表的响应。 不知道为什么,有什么建议吗

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) {}

    }       
    }
}

添加了一个线程。睡眠可以正常工作。

我不太懂代码。什么是线程pasvKonsole=新线程new PasvKonsolethis;好吗?你在“非多线程”的世界里尝试过吗?哎呀,这应该被注释掉。这个线程应该打印从服务器收到的答案。你在getPasvCon中从不调用列表?哈哈,你是对的。但是现在当我这么做的时候,我得到的只是一堆空白。请确保关闭问题和/或发布你的答案…这不是正确的方法!您几乎不应该调用ready并依赖它返回的内容,它只用于非常特殊的情况。通常,您只需要调用read并等待数据可用。添加Thread.sleep是一个丑陋的、依赖于时间的解决方法,当您在较慢的网络上运行它时,它会立即中断,如果您在较快的网络上运行,则会不必要地降低应用程序的速度。一般来说:如果你需要大量的线程。在你的网络代码中睡眠,那么你就做错了@joahim sauer你建议不穿线就等一等怎么样?通常,您只需要调用read并等待数据可用。