# Wie empfange ich eine ftp liste?



## mr.deaht (4. Jul 2005)

```
public class Connect implements Runnable{
    Socket socket;
    BufferedReader in;
    PrintStream out;
    public Connect() {
        try{
        socket = new Socket("ftp.myftp.de",21);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out=new PrintStream(socket.getOutputStream());
        Thread s=new Thread(this);
        s.setPriority(Thread.MIN_PRIORITY);
        s.start();
        out.println("USER anonymous");
        out.println("PASS [email]anonym@anonym.de[/email]");
        out.println("SYST");
        out.println("PWD");
        out.println("PASV");
        out.println("LIST");
    } catch (UnknownHostException ex) {System.out.println("Host:"+ex);
    } catch (IOException ex) {System.out.println("s:"+ex);
    }
    }
    public static void main(String[] args) {
        Connect connect = new Connect();
    }

    public void run() {
        while(true){
        try {
            System.out.println(in.readLine());
        } catch (IOException ex) {
        }
        }
    }
}
```

Der Befehl um die server liste zu bekommen dürfte doch eigendlich stimmen leider wird aber keine liste versendet. Was mach ich falsch?? Die verbindung zum ftp wird ohne probleme aufgebaut.


----------



## KISS (4. Jul 2005)

sicher das das kommando stimmt. vgl raw ftp commands
was willst du eigentlich machen? wenn du einen eigenen ftp server schreiben willst, lies mal rfc959


----------



## mr.deaht (4. Jul 2005)

es soll ja kein ftp-server sein. Ich will ein ftp-client schreiben. Der obere teil zum einloggen funktioniert. Nun möchte ich aber eine liste bekomme auf dem die dateien des ftp's angezeigt werden.


----------



## KISS (4. Jul 2005)

auch der client arbeitet ueber einen tcp command stream und einen udp data stream. du wirst also nicht umhinkommen die die rfcs durchzulesen.
die liste bekommst du wahrscheinlich nicht weil der server afair keinen zeilenumbruch mitschickt


----------



## mr.deaht (4. Jul 2005)

Ist doch egal ob er zeienumbrüche macht oder nicht.
Wie kann ich jetzt aber diese lieste überhaupt empfangen??
Hat da einer eine idee?
Ich habe das mit dem passiv modus nicht so verstanden was macht der??


----------



## Bleiglanz (5. Jul 2005)

könnte dran liegen dass ftp einen zweiten socket für den datenverkehr benutzen möchte

=> nimm lieber eine fertige library


----------



## KISS (5. Jul 2005)

mr.deaht hat gesagt.:
			
		

> Ist doch egal ob er zeienumbrüche macht oder nicht.



wenn man readline benutzt ist dies durchaus nicht egal


----------



## 8ull23y3 (5. Jul 2005)

Da muss ich Bleiglanz beipflichten schon wenn du in deinen Stream den Befehl benutzt um in den Passive Mode zu wechseln kommste nicht weiter da kommt garkein LIST beim Server an ich habs letzens selbst probiert. Du erhälst einen neuen Port (steht dann im Response)  das ist der Port für die Datenübertragung soviel ich weiss 
Schau dir mal die Commonss-Net von Jarkarta an!


----------



## mr.deaht (5. Jul 2005)

ich kenne die library. Ich will nur ein bissle selber mit herumexperimentieren.


----------



## AlArenal (5. Jul 2005)

mr.deaht hat gesagt.:
			
		

> ich kenne die library. Ich will nur ein bissle selber mit herumexperimentieren.



Dann schau dir deren Sourcecodes an.


----------



## aquanox (6. Jul 2005)

Ich hab mal einen funktionierenden FTP Server geschrieben.

FTP benutzt, gegen den meisten Infos in den Köpfen, zwei Ports.
1. Port ist als Standard 21. Über diesen Port werden die Komandos abgehandelt, also z.B. dein LIST.
2. Port ist als Standard auf dem Server Nr 20. Alle Daten, wie Dateien oder auch die Liste wird über diesen zweiten Datenport geschickt. Für jede Datenaktion wird eine neue Datenverbindung hergestellt, somit ist es möglich Dateien hoch/runterzuladen und gleichzeitig auf dem Komandoport eventuelle Fehler abzuhandeln.

Was passiert also:

PASV sagt dem Server: Ich möchte die nächste Datenverbindung über Pasiv abhandeln. Der Server antwortet dir mit sechs Zahlen mit Komma getrennt. Im Prinzip ist das die IP und der Port auf dem Server, den dir dieser für die nächste Datenverbindung zur Verfügung stellt. Für jede Datenverbindung wird außerdem ein neuer Port beantragt.

LIST sagt dem Server: Schicke mir die Liste des aktuellen Verzeichnisses und zwar über den Datenport. Bei Pasiv bedeutet das, dass der Client einen zweiten Socket öffnet um sich mit den übergebenen Daten des Servers zu verbinden. Der Server kann dann das Zeug schicken und anschließen wird die Datenverbindung wieder geschlossen und man kann von vorne anfangen.

Dazu gibts noch den Aktiv Mode. Dabei schickt der Client über den Befehl PORT und den sechs Kommagetrennten Werten seine Daten dem Server zu, öffnet den Port und wartet dass der Server sich verbindet.

Im Groben wars das, bei weiteren Fragen bitte Melden.


----------



## mr.deaht (7. Jul 2005)

@AlArenal
Die Bibliothek ist mir zu unübersichtlich ich finde da den passenden Code nicht

@aquanox
kannst du mir sagen wie ich die liste vom ftp abrufe oder was an meinem quellcode falsch ist.
	
	
	
	





```
e import java.net.*;
import java.io.*;
import java.util.*;
public class FTPConnect implements Runnable{
	BufferedReader in;
	PrintStream out;
	Socket socket;
	Thread th = new Thread(this);
	FTPConnect(){
		verwalten();
	}

	public static void main(String[] args) {
     FTPConnect connect = new FTPConnect();
	}
   public void verwalten(){
	   try {
	            socket = new Socket("ftp.suse.de",21);
	            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
	            out=new PrintStream(socket.getOutputStream());
	            th.setPriority(Thread.MIN_PRIORITY);
	            th.start();
	            out.println("USER anonymous");
	            out.println("PASS anonym@anonym.de");
	            out.println("SYST");
	            out.println("PWD");
	            out.println("PASV");
	} catch (UnknownHostException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
  }
  
   public void run() {
	   String s;
   
	   while(true){
	   try {
		 s=in.readLine();
		 StringTokenizer st = new StringTokenizer(s);
		 if(st.nextToken().matches("227")==true){
			s=s.substring(s.indexOf("("+1),s.indexOf(")"));
			int i=0;
			for(int a=0;a<4;a++){
				i=s.indexOf(",",i+1);
			}
			String ip=s.substring(0,i);
			ip=ip.replaceAll(",",".");
			int zahl1=Integer.parseInt(s.substring(i+1,s.indexOf(",",i+1)));
			int zahl2=Integer.parseInt(s.substring(s.indexOf(",",i+1)+1,s.length()));
			zahl1=zahl1*256+zahl2;
			List list= new List(ip,zahl1);
		 }
		System.out.println(s);
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} 
	   }
   }

}
class List implements Runnable{
	   Socket socket1;
	   BufferedReader in1;
	   PrintStream out1;
	public List(String ip, int port){
	       try {
	   		socket1 = new Socket(ip,port);
	          in1 = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
	          out1 =new PrintStream(socket1.getOutputStream());
	          Thread th = new Thread(this);
	          th.setPriority(Thread.MIN_PRIORITY);
	          th.start();
	          out1.println("NLST");
	      	} catch (UnknownHostException e) {
	   		// TODO Auto-generated catch block
	   		e.printStackTrace();
	   	} catch (IOException e) {
	   		// TODO Auto-generated catch block
	   		e.printStackTrace();
	   	}
	}
	public void run() {
		// TODO Auto-generated method stub
		String s;
		while(true){
			try {
				s=in1.readLine();
				System.out.println("-----"+s);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
```

In Zeile  74 wird immer die IOException ausgeführt. Was ist an diesem Code falsch?? Eine socket verbindung wird aber aufgebaut über den neuen Port. Ich bekomme aber kein InputStream. Kannst du mir helfe??


----------



## Stefan1200 (11. Jul 2005)

Mir hat folgender Thread geholfen, als ich bei mir FTP Fähigkeit programmiert habe:
http://www.java-forum.org/de/viewtopic.php?t=17163


----------

