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