FTP Nochmal wachsende Datei per FTP lesen

peez

Bekanntes Mitglied
Habe es jetzt hinbekommen, dass ich überhaupt eine Datei vom FTP-Server lesen kann, die gerade von jemand anderem geschrieben wird. Das war eine Server-Einstellung.
Jetzt habe ich das Problem, dass entgegen der Erwartung, irgendwann einfach keine Daten mehr kommen. Mein Code sieht so aus:
Java:
byte buf[] = new byte[getReadBuffer()];
	int len;
	boolean doRead = true;
	long bytesRead = 0;
	long readStopTimestamp = 0l; // An diesem Zeitstamp wurde aufgehört zu
				     // lesen, wird auf 0 zurückgesetzt wenn
				     // wieder Daten verfügbar sind

	try {

	    while (doRead) {

		len = inputStream.read(buf);
		
		if (len != -1) {
		    bytesRead += len;
		    onRead(buf, 0, len);

		    if (readStopTimestamp > 0) {
			readStopTimestamp = 0;
		    }
		} else {
		    if (readStopTimestamp == 0) {
			readStopTimestamp = System.currentTimeMillis();
		    }
		    
		    if (System.currentTimeMillis() > readStopTimestamp + 10000) {
			doRead = false;
		    }else{
        		    try {
        			Thread.sleep(1000);
        		    } catch (InterruptedException e) {
        		    }
		    }

		}
	    }
	} catch (IOException e1) {
	    // TODO Auto-generated catch block
	    e1.printStackTrace();
	}

Die Theorie: Er liest bis keine Daten mehr kommen (-1). Dann wartet er eine Sekunde und versucht wieder zu lesen. Wenn wieder keine Daten kommen wird eine weitere Sekunde gewartet usw..
Wenn dann für 10 Sekunden keine Daten mehr kommen, wird die Datei als fertig angesehen.

Das Problem ist, dass wenn einmal die -1 zurückgegeben wird, einfach keine Daten mehr kommen obwohl die Datei wächst und wächst.

Jemand ne Idee bzw. Erfahrung mit FTP-Servern? Liegt das an mir oder am Server? Ich verwende hier FileZilla zum Testen.
 
Ich vermute, dass es an dir liegt.

Das hier dürfte das Codefragment sein:
Java:
if (System.currentTimeMillis() > readStopTimestamp + 10000)
{
doRead = false;
}

System.currentTimeMillis() liefert die aktuelle Zeit in Millisekunden seit dem 01.01.1970, wenn ich das richtig im Kopf habe.
Und dieser Wert wird unter Garantie immer größer sein als readStopTimestamp + 10000.

Somit trifft deine Abbruchbedingung schon beim ersten Auftreten des Wertes -1 zu.
 
Nee readStopTimestamp ist schon richtig gefüllt. Wenn das erste mal len == -1 ist, dann wird der ja auf den aktuellen Timestamp (Zeile 24). In den nächsten Durchgängen wird das dann entweder auf 0 zurückgesetzt, wenn wieder Daten verfügbar sind oder mit System.currentTimeMillis() verglichen.
 
Na ich rate mal dein FTP Server hört zu lesen auf wenn das Ende der Datei erreicht wurde, infolgedessen sendet er auch nichts mehr. Warum willst du überhaupt eine wachsende Datei mit ftp downloaden, das klingt mehr nach Streaming als File Transfer.
 
Dabei gehts darum, so schnell wie möglich die Checksummen zu generieren von den Files die geschrieben werden. Deshalb wird direkt gelesen sobald die Datei im Verzeichnis auftaucht (anders scheint es eh nur sehr unzuverlässig zu sein - habe gesehen dass (jedenfalls hier beim Filezilla) eine Datei mit ca. 350MB nach 70 MB im Dirlisting des FTP-Servers stehen bleibt und erst ganz am Ende die finale Größe angezeigt wird).

Hm ja wenn das Dateiende erreicht ist hört er auf. Aber im nächsten Durchlauf sollte dann doch wieder was da sein das er senden kann?!
 
Der Server liest halt solange bis er das Ende erreicht hat, dann wird der Transportsocket geschlossen. Woher soll er auch wissen dass noch jemand die Datei zum Schreiben offen hat und _evtl_ noch weitere Daten kommen?

Bei Java kommt nur -1 wenn das Ende erreicht ist, und dann bleibt das auch so. Denn würde er plötzlich weiter gehen dann wäre es ja vorher nicht das Ende gewesen und es hätte keine -1 kommen dürfen...
 
Hmm... Und wie soll man dann mit Java in einem Strom lesen so viel eben kommt? (Wenn z.B. die Lese-Verbindung schneller als die Schreib-Verbindung ist)

Mal ganz unabhängig von FTP, wenn man z.B. selbst ein Socket aufmacht und eben die Länge nicht im Voraus überträgt oder nicht weiß..
 
-1 kommt dann wenn der Socket geschlossen wird/das Ende des Streams erreicht ist.
Wenn nichts mehr kommt weil gerade die Gegenseite nicht schickt, aber durchaus nochmal irgendwann Daten kommen können, dann kommt halt ne 0, is doch eingentlich logisch?!
 
Das problem ist, dass ein normaler FTP server sowas was du möchtest nicht unterstützen dürfte. Du wirst dir selber einen Server schreiben müssen für dein Unterfangen.
 
Selbst dass wird ihm nichts bringen, außer er kann feststellen wann das Programm, das die Datei schreibt, damit fertig ist, und das dürfte ohne API dieses Programms hoffnungslos sein.
 

Neue Themen


Zurück
Oben