# FTP Client mit Sockets - wann sagt der Server nichts mehr?



## Flu (28. Jul 2011)

Moin Leute.
Ich möchte einen FTP Client auf Socketbasis erstellen.
Das funktioniert so weit auch ganz gut, anmelden an den Server ist kein Problem.
Mein Client besteht zur Zeit aus 2 Klassen, die parallel gestartet werden.
Einmal der ClientKlasse, die die Befehle an den Server schickt, und einer Konsolenklasse, die immer horchen soll, ob der Server was sagt und es dann per println in die Konsole schreiben.
So weit so gut, das funktioniert alles.

Allerdings soll jetzt der Client wissen, wann nichts mehr in die Konsole geschrieben wird, dann 20sec warten und ein NOOP abschicken, und dann wieder warten bis die Konsole sagt, dass sie nichts neues mehr hat.

Mein Problem: Woher weiß ich, wann nichts neues mehr kommt? Die Konsole gibt brav alle Servermeldungen aus und dann nichts mehr.
Allerdings kann ich das "Nichts" nicht abfangen.
Es ist weder "", noch null.
Auch ein isEmpty() ergibt immer false, obwohl nichts mehr kommt?!


```
import java.io.IOException;


public class Konsole extends Thread {
	
	Client client;
	
	public Konsole(Client client) {
		this.client = client;
	}
	
	public void run() {
		
	while(true) {
		
		
		try {
			String line = client.fromServer.readLine();
			
			if(!line.isEmpty() ) {
				System.out.println(line);
			}
			else {
				System.out.println("Leer");
			}
			
			
		} catch (IOException e) {}
		
	}
	
			
					
			
	}
}
```


----------



## Gelöschtes Mitglied 5909 (28. Jul 2011)

das liegt daran dass readLine() blockiert, bis die nächste eingabe vom server kommt.
D.h. entweder die Verbindung wird unterbrochen oder er wartet potentiell unendlich.

Das ist aber auch durchaus gewünscht würde ich sagen.
Was ist denn das problem daran?


----------



## Flu (28. Jul 2011)

Vom Server kommt ein TimeOut nach XY Sekunden, wenn kein neuer Befehl kommt.
Daher soll alle YX Sekunden ein NOOP gesendet werden


----------



## Michael... (28. Jul 2011)

Flu hat gesagt.:


> Vom Server kommt ein TimeOut nach XY Sekunden, wenn kein neuer Befehl kommt.
> Daher soll alle YX Sekunden ein NOOP gesendet werden


Du kannst ja parallel einen "Timer" laufen lassen, der nach jedem Einlesen zurückgesetzt wird. Erreicht der Timer XY-z schickt er ein Dummy Paket an den Server.


----------



## Michael... (28. Jul 2011)

So neben bei: Dir ist schon bewusst, dass wenn Du einen FTP Client und Server nachbauen willst, eine Kommunikation basierend auf Strings nicht geeignet ist?


Flu hat gesagt.:


> ```
> String line = client.fromServer.readLine();
> ```


----------



## Flu (28. Jul 2011)

Die Strings sind eigentlich nur dafür da, die Kommandos zu übermitteln, der Datentransfer soll dann über StreamReader / Writer erfolgen


----------



## Michael... (28. Jul 2011)

Wollte nur sichergehen, dass Dir das bewusst ist. Ich würde die Kommandos allerdings ebenfalls per Byte/Datenstrom übertragen, dann hätte man eine "einheitliche" Kommunikation, die vermutlich auch einfacher zu implementieren ist.


----------



## Gelöschtes Mitglied 5909 (28. Jul 2011)

Flu hat gesagt.:


> Die Strings sind eigentlich nur dafür da, die Kommandos zu übermitteln, der Datentransfer soll dann über StreamReader / Writer erfolgen



Du weißt, dass writer / reader NUR für textdaten geeignet sind? Verwende Streams und keine reader/writer


----------

