größere datenübertragung

Status
Nicht offen für weitere Antworten.

weljo

Bekanntes Mitglied
Hi leute hab ein client server programm welches nur über socket verbunden ist(sprich nicht als laufwerk vorhanden). ich muss daten in etwa der größe 300 MB vom Server zum Client schaffen. muss ich bei der datengröße irgendwas besonderes beachten?

oder kann ich einfach problemlos(ohne datenverlust:)) mit dem BufferdReader eine Zeile einlesen und über den Output Stream versenden und am client das umgekehret? oder muss ich irgendwie sagen dass ich DCP verwenden will oder selber abfragen ob alles angekommen ist mit prüfsumme ec ?.

also die frage nochmal kürzer. welche probleme erwarten mich?
 
Zuletzt bearbeitet:

madboy

Top Contributor
Mit einem *Reader werden dich größere Probleme erwarten ;-)
Es sei denn, du willst Textdateien verschicken.

Verwende Streams, dann sollte alles passen.
Prüfsummen sind nicht verkehrt aber meiner Meinung nach nicht nötig.
 

weljo

Bekanntes Mitglied
also einfach mit streams stück aus datei lesen ---> daten versenden---------------->daten empfangen --->stückweise schreiben


in wie große teile soll ich die Datei zerteilen???
soll ich jetzt überprüfen ob alles angekommen ist und vorallem richtig oder erledigt mir das bereits ein netzwerkprotukoll?

hab ich noch irgendwas zu erwarten sobald ich das lokale netz verlasse ???
 
Zuletzt bearbeitet:

madboy

Top Contributor
Du brauchst die Datei nicht zu zerteilen. Das übernimmt das Übertragungsprotokoll und das Betriebssystem. Einfach Socket öffnen, OutputStream holen und dort den von der Datei gelesenen Datenstrom rein schreiben.
Das lokale Netz verhält sich gleich wie das "nicht lokale" falls du damit das Netz auf der anderen Seite des Routers meinst. Bis auf die zu erwartende Geschwindigkeit natürlich :)

Evtl. musst du aber noch auf der Serverseite einen Port am Router öffnen, wenn lokal alles klappt aber übers Internet nicht.
 
T

tuxedo

Gast
Du brauchst die Datei nicht zu zerteilen.

Blödsinn. Willst du eine 300MB Datei am Stück in den RAM lesen und mit einem einzigen write() Kommando verschicken?

Natürlich sollte man zu versendende Dateien häppchenweise lesen und verschicken. Alles weitere erledigt der TCP-Stack. Auf dem Socket hast du normalerweise einen Puffer von 8k. Musst ausprobieren mit welcher Häppchengröße es am schnellsten/besten funktioniert. Zu klein würd' ichs nicht machen. Würde so mit 64k mal anfangen zu testen.

Der ZIP-Stream macht nur dann Sinn, wenn die zu übertragenden Daten nicht schon komprimiert sind. Eine 300MB ZIP Datei wird nicht so viel kleiner. Eine 300MB TXT File hingegen schon. Kommt also auf den Einzelfall an.

- Alex
 

objcler

Aktives Mitglied
Blödsinn. Willst du eine 300MB Datei am Stück in den RAM lesen und mit einem einzigen write() Kommando verschicken?

Natürlich sollte man zu versendende Dateien häppchenweise lesen und verschicken. Alles weitere erledigt der TCP-Stack. Auf dem Socket hast du normalerweise einen Puffer von 8k. Musst ausprobieren mit welcher Häppchengröße es am schnellsten/besten funktioniert. Zu klein würd' ichs nicht machen. Würde so mit 64k mal anfangen zu testen.

Der ZIP-Stream macht nur dann Sinn, wenn die zu übertragenden Daten nicht schon komprimiert sind. Eine 300MB ZIP Datei wird nicht so viel kleiner. Eine 300MB TXT File hingegen schon. Kommt also auf den Einzelfall an.

- Alex

Er schrieb ja "vieleicht".
 

madboy

Top Contributor
Ich kann mich zwar nicht erinnern, "vielleicht" geschrieben zu haben aber tuxedo hat natürlich recht. :oops:
 

zerni

Mitglied
Wie hast du das Problem denn jetzt gelöst?

Ich stehe vor einem ähnlichen Problem. Bekomme aber ständig ein Java Heap Space Error.

Exception in thread "AWT-EventQueue-1" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2786)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
at sun.net.www.http.PosterOutputStream.write(PosterOutputStream.java:61)

Ich vermute mal, dass die Daten in den OutputStream geschrieben werden, diese aber dann nicht übertragen bzw. wieder gelöscht werden bis die nächsten kommen. Somit läuft das Ding über...

Mache ich hier was grundlegendes falsch??

Java:
URLConnection con = url.openConnection();
            con.setDoOutput(true);
            OutputStream output = con.getOutputStream();
            WritableByteChannel outputChannel = Channels.newChannel(output);
            FileChannel inputChannel = input.getChannel();
            int readlen=0, totalbytes=0;
            uploading = true;
            while (((readlen=inputChannel.read(buffer))>=0 || buffer.position() != 0)
                        && uploading) {
                
                buffer.flip();
                outputChannel.write(buffer);
                buffer.compact();
                buffer.clear();
                totalbytes+=readlen;
            }

EDIT: der Heap Space läuft auch voll wenn ich ihn auf 256mb erhöhe. Es versucht also wirklich die ganz Datei darin abzulegen.
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Hast du's mal ohne Channels probiert? Also direkt mit einem Stream?
Hast du mal probiert "flush();" zu benutzen?
 

weljo

Bekanntes Mitglied
@zerni: habs noch garnicht probiert bin bei einem etwas größeren projekt und noch in der planung(obwohl ich lieber drauf loslegen würd) und klähr noch die machbarkeit in dem vorgegebenem zeitraum ab.

2. hab noch an ein weiteres problem gedacht. Kann ich die InPutStreams einfach wieder in den OutPutStream schreiben sprich in die datei oder muss ich die reihenfolge beachten (hab nämlich die befürchtung dass DCP zwar die fehlenden Pakete sendet, jedoch bis das passiert inzwischen andere pakete sendet)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben