# größere datenübertragung



## weljo (22. Sep 2009)

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?


----------



## madboy (22. Sep 2009)

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 (22. Sep 2009)

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 ???


----------



## madboy (22. Sep 2009)

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.


----------



## dayaftereh (22. Sep 2009)

nutz vieleicht ZipOutputStream und ZipInputStream


----------



## tuxedo (23. Sep 2009)

> 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 (23. Sep 2009)

tuxedo hat gesagt.:


> 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.
> 
> ...



Er schrieb ja "vieleicht".


----------



## tuxedo (23. Sep 2009)

objcler hat gesagt.:


> Er schrieb ja "vieleicht".



War ja nur ergänzend gemeint ...

- Alex


----------



## madboy (23. Sep 2009)

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


----------



## tuxedo (23. Sep 2009)

madboy hat gesagt.:
			
		

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



Du nicht, aber er hier:



dayaftereh hat gesagt.:


> nutz vieleicht ZipOutputStream und ZipInputStream



Das 



			
				objcler hat gesagt.:
			
		

> Er schrieb ja "vieleicht".



Bezog sich ja auf den ZipStream ...


----------



## weljo (23. Sep 2009)

ok schon mal thx leute hat mir geholfen .... meld mich dann wenns nicht klappt gg


----------



## zerni (26. Sep 2009)

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??


```
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.


----------



## tuxedo (28. Sep 2009)

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


----------



## weljo (28. Sep 2009)

@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)


----------



## weljo (28. Sep 2009)

1. alles geklährt ist kein probelm und wer ein beispiel zu dem thema möcht 

http://www.tutorials.de/forum/java/245134-datei-mittels-tcp-uebertragen.html


----------

