RMI Fortschritt bei Up/Download anzeigen

_Andi91

Bekanntes Mitglied
Hi,

ist es bei RMI irgendwie möglich, den Fortschritt bei einem Aufruf zu ermitteln?
zB wenn ich eine Datei einlese und dessen Inhalt über RMI verschicke, möchte ich den Fortschritt in einer Progress Bar anzeigen.
 
Wenn dir der Server vor dem Download die Größe mitteilt, dann kannst du den Fortschritt in % ermitteln: erhaltene Bytes / alle Bytes * 100.

...und große Daten sollte man streamen ...
 
Wenn dir der Server vor dem Download die Größe mitteilt, dann kannst du den Fortschritt in % ermitteln: erhaltene Bytes / alle Bytes * 100.

...und große Daten sollte man streamen ...

wie komme ich an die Anzahl der erhaltenen Bytes, wenn das ganze über RMI läuft?


Ich habs jetzt mal mit Sockets probiert.
Also ich hab mir eine eigene SocketKlasse geschrieben, die den SocketInputStream "umhüllt".
In der hab ich die read(byte,int,int) Methode überschrieben.
Ich lese immer nur ein Byte aus dem Stream in das Array.
Im Code sieht das folgendermaßen aus:

Java:
int bytesRead = 0;
		
for (int i = 0; i < len; i++)
{
           bytesRead += super.read(b, i, 1);
}
		
return bytesRead;


Klappt soweit schon aber ist sehr performance lastig.
Deswegen hab ich mir gedacht ich les immer einen gewissen Teil statt jedes byte einzeln
also quasi so in der Art:

Java:
int bytesRead = 0;
int stepSize = getStepSize();
		
for (int i = 0; i < len;)
{
	bytesRead += super.read(b, i, stepSize);
	i+=stepSize;
}
		
return bytesRead;

In der Methode getStepSize() wird dann berechnet, wie viel ich immer schrittweise auslesen will in Abhängigkeit von der Größe. Also zB wenn die Länge 1000 ist und ich immer prozentweise lesen will. Dann liefert die Methode 10 (1000/100%) zurück.

Klappt aber irgendwie nicht so ganz. Beim ersten Durchlauf scheint noch alles zu gehen aber dann liefert die Methode super.read(...) -1 zurück, was dann früher oder später zu einer IndexOutOfBoundException führt, weil i -1 ist.
 
Hi _Andi91,

in der Doku steht:
the total number of bytes read into the buffer,
or -1 if there is no more data because the end of the file has been reached

Das heißt, dass die Datei doch nicht solange ist, wie geglaubt.
Einfach auf bytesRead == -1 prüfen, und nicht weiterlesen, wenns true ist.
 
also ich weis nicht was ich jetzt anders gemacht habe aber jetzt gehts...
Performance mäßig ist es allerdings immer noch eher schlecht (sehr schlecht:noe🙂
Mit meinem WrapperStream dauert der Transfer(lokal) einer 16MB grossen Datei ca. 17 Sekunden und ohne 94 ms. Also schon gewaltiger Unterschied...
 
also ich weis nicht was ich jetzt anders gemacht habe aber jetzt gehts...
Performance mäßig ist es allerdings immer noch eher schlecht (sehr schlecht:noe🙂
Mit meinem WrapperStream dauert der Transfer(lokal) einer 16MB grossen Datei ca. 17 Sekunden und ohne 94 ms. Also schon gewaltiger Unterschied...

Was machst du da? Wofür soll der Wrapper gut sein?
Byteweise lesen ist natürlich nicht so performant. Also immer einen bestimmte Menge Daten lesen, wenn vorhanden. Das macht der BufferedInputStream. Die Größe des Puffers kannst du setzen und deinen Bedürfnissen anpassen...

So geht das im Prinzip:
BufferedInputStreamFileJava Tutorial

Du wolltest das mit RMI machen. Also frägst du die Größe der Datei explizit ab (eine selbst implementierte Methode) und streamst sie dann zum Client.
rmi streaming - Google-Suche
 

Neue Themen


Zurück
Oben