# FTP zugriff - ich versteh es nich



## Sayo~ (17. Okt 2006)

also :


```
import java.io.IOException;
import sun.net.ftp.*;

public class FtpTest {
	
	FtpTest()throws IOException
	 {
		FtpClient ftpcl = new FtpClient();
		ftpcl.openServer("ftp://ftp.hs-niederrhein.de");
		ftpcl.cd("/pub/antivir/f-prot/");
		ftpcl.closeServer();
	}
	
	public static void main(String[] args) throws IOException {
		
		FtpTest ftpzugriff = new FtpTest();
		
	}

}
```

das sollte eigentlich nur ein test sein aber das geht ja gar nicht und es wirft mir folgenede exception  :autsch:  :


```
Exception in thread "main" java.net.UnknownHostException: [url]ftp://ftp.hs-niederrhein.de[/url]
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at sun.net.NetworkClient.doConnect(Unknown Source)
	at sun.net.NetworkClient.openServer(Unknown Source)
	at sun.net.ftp.FtpClient.openServer(Unknown Source)
	at sun.net.ftp.FtpClient.openServer(Unknown Source)
	at FtpTest.<init>(FtpTest.java:11)
	at FtpTest.main(FtpTest.java:18)
```

kann mir jemand sagen was da jetzt so falsch is 

ich will eigentlich nur auf den server connecten und wieder schließen aber das geht ja nich mal  :bahnhof:


----------



## thE_29 (17. Okt 2006)

Wie wärs ohne dem ftp:// vorne 

ftp.hs-niederrhein.de

Dieses ftp:// oder http:// gibt ja das Protokoll an und wenn du schon mit einer ftp Klasse arbeitetest, gehen die davon aus, das du da auch nur nen ftp Tauglichen Host einträgst


----------



## Sayo~ (17. Okt 2006)

ah okay :autsch: 

danke dir sehr das geht schon mal    ,  aber der cd geht O_O"

das wirft dann folgende exception 

Exception in thread "main" sun.net.ftp.FtpLoginException: Not logged in
	at sun.net.ftp.FtpClient.readReply(Unknown Source)
	at sun.net.ftp.FtpClient.issueCommand(Unknown Source)
	at sun.net.ftp.FtpClient.issueCommandCheck(Unknown Source)
	at sun.net.ftp.FtpClient.cd(Unknown Source)
	at FtpTest.<init>(FtpTest.java:10)
	at FtpTest.main(FtpTest.java:16)

was hab ich da falsh geamcht ?


also zur info das sollte eigentlich ein KSDS (oder so) werden was andre uhres beschrieben hat 
server und so hab ich mir einfahc einen mit google rasugepickt


----------



## thE_29 (17. Okt 2006)

Na du musst dich schon einloggen ^^

ftpclient.login() wäre ne gute Idee


----------



## Sayo~ (17. Okt 2006)

wie einloggen wenn das n public ftp server is ? :shock: 

anonymous oder was ?


----------



## thE_29 (17. Okt 2006)

Jop, dann mit anonymous!

Explorer oder dgl loggen sich immer mit anonymous automatisch ein, wenn kein username angegeben ist!


----------



## Sayo~ (17. Okt 2006)

aah okay
-> anonymous genommen pswwort freigelassen 
 -> exception das passwort 331 sein muss
  -> 331 eingegeben = es geht keine exceptions mehr   

okay so weit so gut und danke thE_29 sehr nett das du mir so schnell geholfen hast  :toll: 

so jetzt hab ich noch eine frage :

also ich will weil da auf dem server ne datei liegt glaub bla.txt was weiß ich 
die datei einfach nur einlesen 

also ... .get("bla.txt");

und dann ? auslesen wie geht das von statten ?  :bahnhof:  sry wenn das schon gepostet wurde 
aber wenn hier auch einer reinschaut den das interessiert dann is es auch gleich beisammen 

wär nett wenn du darauf auch noch eine antowrt hättest ... hab da was von buffer gehört hab da aber 0 plan  :cry:

btw. was heißt dgl ? ???:L


----------



## thE_29 (17. Okt 2006)

Du kriegst beim get einen TelnetInputStream zurück!

Diesen stream auslesen und in einen anderen Stream (sprich Datei) reinschreiben!


Outputstream out = new FileOutputStream("C:\\dein_datei.txt");

out.write(tistream.read());

Als Bsp, wobei der tistream das Objekt ist, was die get Methode zurückliefert!
Für streams, einfach mal die Boardsuche benutzen!


----------



## Sayo~ (17. Okt 2006)

okay das hilft mir schon mal sehr    
ich danke dir 

mein cod sieht jetzt so aus :


```
import java.io.*;
import sun.net.TelnetInputStream;
import sun.net.ftp.*;

public class FtpTest {
	
	FtpTest()throws IOException
	 {
		FtpClient ftpcl = new FtpClient();
		ftpcl.openServer("ftp.hs-niederrhein.de");
		ftpcl.login("Anonymous", "331");
		ftpcl.cd("/pub/antivir/f-prot/");
		ftpcl.get("faq.txt");
		TelnetInputStream in = ftpcl.get("faq.txt");
		OutputStream out = new FileOutputStream("F:\\faq.txt");
		out.write(in.read());
		ftpcl.closeServer();
	}
	
	public static void main(String[] args) throws IOException {
		
		FtpTest ftpzugriff = new FtpTest();
		
	}

}
```

geht zwar nich weil sicher noch ne schleife rein muss oder so aber kommt noch  
falls jetzt schon offensichtlich is was fehlerhaft is kann da ja wer posten

okay dann werd ich mal n bissl das forum nach streams etc. durchsuchen 

danke nochmal thE hast mir sehr geholfen  :toll:  :toll:

/edit :
btw. noch ne frage was passiert eigentlich wenn ich den client nich mit .close() schließe ?
wenn ichs zum test "ausklammere" passiert bei mir nichts?
wird da die verbindung aufrecht erhalten oder wie ? wenn ja kann man ja so voll leicht irgendwelche ftp server flooten das wär ja ne ganz schöne sicherheitslücke   
oder es passiert einfach gar nix  :? 

weiß da einer ne antwort drauf ?


----------



## thE_29 (17. Okt 2006)

Den Befehl kannst dir sparen: ftpcl.get("faq.txt"); 

Weil du ihn nachher nochmals machst!

Und ja es fehlt ne Schleife, du schreibst jetzt 1 byte rein 


Und out.close(); fehlt auch noch!


----------



## Sayo~ (17. Okt 2006)

wollt kurz auf mein edit hinweisen das das nich überlesen wird 





			
				ich selbst hat gesagt.:
			
		

> /edit :
> btw. noch ne frage was passiert eigentlich wenn ich den client nich mit .close() schließe ?
> wenn ichs zum test "ausklammere" passiert bei mir nichts?
> wird da die verbindung aufrecht erhalten oder wie ? wenn ja kann man ja so voll leicht irgendwelche ftp server flooten das wär ja ne ganz schöne sicherheitslücke
> ...


----------



## Sayo~ (17. Okt 2006)

sry für doppelpost aber der obrige fand ich sollte allein stehn ...

also zu schleife gibt es einen befehl der mir sagt wieviel bytes eine datei enthällt ? 
oder besser noch einen befehl der mir sagt wieviel ich noc zu lesen hab  bis datei zu ende ? 
und wenn ja wie heißtn der?

dann noch die exception die jetzt geworfen wird 


```
Exception in thread "main" sun.net.TelnetProtocolException: misplaced CR in input
	at sun.net.TelnetInputStream.read(Unknown Source)
	at FtpTest.<init>(FtpTest.java:15)
	at FtpTest.main(FtpTest.java:24)
```

inkl. den mehr oder weniger "überarbeiteten" code den ich jetzt hab :


```
import java.io.*;
import sun.net.TelnetInputStream;
import sun.net.ftp.*;

public class FtpTest {
	
	FtpTest()throws IOException
	 {
		FtpClient ftpcl = new FtpClient();
		ftpcl.openServer("ftp.hs-niederrhein.de");
		ftpcl.login("Anonymous", "331");
		ftpcl.cd("/pub/antivir/f-prot/");
		TelnetInputStream in = ftpcl.get("faq.txt");
		OutputStream out = new FileOutputStream("F:\\faq.txt");
		out.write(in.read());
		out.close();
		in.close();
		ftpcl.closeServer();
		
	}
	
	public static void main(String[] args) throws IOException {
		
		FtpTest ftpzugriff = new FtpTest();
	}

}
```


----------



## thE_29 (17. Okt 2006)

```
byte buf[] = new byte[1024];

for(int x = in.read(buf,0,1024); x != -1; x = in.read(buf,0,1024))
  out.write(buf,0,x);
```

So, der schreibt dir das jetzt rein.

Man sollte immer alle Verbindungen closen die ein close haben, den umsonst haben die das ja nicht


----------



## Sayo~ (17. Okt 2006)

thE_29 hat gesagt.:
			
		

> ```
> byte buf[] = new byte[1024];
> 
> for(int x = in.read(buf,0,1024); x != -1; x = in.read(buf,0,1024))
> ...



boah ja es geht  
danke dir  ! bist zu recht mod *schleim* :roll: 

und die antwort aufs close  :toll:  :lol: 

zum code den du gepostet hast was bedeutet 

```
int x = in.read(buf,0,1024)
```
is das einzige was ich jetzt nich peile 

und ich hab noch eine frage   ... was wäre wenn ich eine datei hab die ca. 3 mb groß is 
kann ich die auch lesen mit diesem code ? ne oder weil byte zu klein is ?[/code]


----------



## thE_29 (17. Okt 2006)

Lies dir einfach die API durch, dann weißt du was was tut..

Besser kann ichs dir auch net beibringen


----------



## Sayo~ (17. Okt 2006)

also da das alles nur ein test programm war und nur dazu da war das zu erlernen
 hab ich jetzt folgendes gemacht :
ich hab die ftp-url ersetzt... da ich n programm schreiben soll was nasa daten liest :autsch: ^^

problem is wenn ich mich da einlogen will kommte ne exception die ich nich deuten kann

```
Exception in thread "main" sun.net.ftp.FtpLoginException: password: 331 [002-0192] Challenge: 73288302    Enter: Response

	at sun.net.ftp.FtpClient.login(Unknown Source)
	at FtpTest.<init>(FtpTest.java:11)
	at FtpTest.main(FtpTest.java:27)
```


und so siehts aus wenn ich password eingebe 
	
	
	
	





```
Exception in thread "main" sun.net.ftp.FtpLoginException: Not logged in
	at sun.net.ftp.FtpClient.readReply(Unknown Source)
	at sun.net.ftp.FtpClient.issueCommand(Unknown Source)
	at sun.net.ftp.FtpClient.login(Unknown Source)
	at FtpTest.<init>(FtpTest.java:11)
	at FtpTest.main(FtpTest.java:27)
```

und code schaut jetzt wiefolgt aus 

```
import java.io.*;
import sun.net.TelnetInputStream;
import sun.net.ftp.*;

public class FtpTest {
	
	FtpTest()throws IOException
	 {
		FtpClient ftpcl = new FtpClient();
		ftpcl.openServer("e0srp01u.ecs.nasa.gov");
		ftpcl.login("Anonymous", "331");
		ftpcl.cd("/srtm/version2/SRTM3/Eurasia/");
		ftpcl.binary();
		TelnetInputStream in = ftpcl.get("N00E100.hgt");
		OutputStream out = new FileOutputStream("F:\\bla.hgt.zip");
		byte buf[] = new byte[1024];
		for(int x = in.read(buf,0,1024);x != -1; x = in.read(buf,0,1024))
		 out.write(buf,0,x);
		out.close();
		in.close();
		ftpcl.closeServer();
		
	}
	
	public static void main(String[] args) throws IOException {
		
		FtpTest ftpzugriff = new FtpTest();
	}
}
```

achso zu erwähnen wäre das ich zuvor noch ftpcl.binary(); implementieren musste ... ohne lief das programm nich (für alle die das hier nach vollziehen wollen oder ähnliche probleme haben oder einfach auch neu angefangen haben ftp per java zu programmieren )

btw. thE ich bin mit den API´s nich so bewahnt kannst du mir sagen wo ich die/das finde (auch wenns blöd kling ) ^_^


----------



## thE_29 (17. Okt 2006)

1. probiere anonymous klein schreiben, dann gehts auch!

2. http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStream.html#read(byte[], int, int)


----------



## Sayo~ (17. Okt 2006)

thE_29 hat gesagt.:
			
		

> 1. probiere anonymous klein schreiben, dann gehts auch!
> 
> 2. http://java.sun.com/j2se/1.5.0/docs/api/java/io/InputStream.html#read(byte[], int, int)



1. O_O" achso aaaah ja sry beim beispiel zuvor wars groß  :wink: 

2. danke les ich mir gegebenen falls durch 

und das mit egal wie groß die datei is hat sich anscheind gelöst da geht ja hervorragend 

danke dir nochma ohne dir wär ich sicherlich verzweifelt  :autsch: 

ein hoch auf thE  :toll:  :applaus:  :toll:  :applaus:


ich schließ den thread in 1 std. wenn noch jemand was hinzufügen will


----------

