Netzwerk-Dateiübertragung optimieren

tulius

Mitglied
Tag zusammen.
Ich übertrage mit einem Programm Dateien übers lokale Netzwerk (LAN/WLAN)

Das mache ich derzeit mit dem "Standard-Verfahren":
Server: (verkürzt)

Java:
byte[] buffer = new byte[32*1024];
    int bytesRead;
    while ((bytesRead = input.read(buffer, 0, buffer.length)) > 0)
    {
        output.write(buffer, 0, bytesRead);
    }

Client genauso, liest in den Puffer und schreibt den in die Datei.
Natürlich sind alle Ströme BufferedStreams

Über LAN funktioniert das meistens gut, aber besonders über WLAN ist das furchtbar langsam.
Also:

- Wie kann ich das optimieren und beschleunigen? (besonders für WLAN)
- Spielt die Puffergröße eine entscheidende Rolle für die Übertragungsgeschwindigkeit? (dass bei einem kleinen Puffer zu oft von der Platte gelesen werden müsste ist mir klar, es geht mir um den Einfluss auf die tatsächliche Übertragung
- Würde die Verwendung von java.nio eine in der Praxis tatsächlich relevante Verbesserung der Geschwindigkeit bringen?
- Oder gibt es ein ganz anderes Verfahren, das viel besser geeignet wäre?
 

tulius

Mitglied
"Gut" ist ziemlich am Maximum, was so ein 100Mbit-Netzwerk hergibt, durchaus mal 12MB/s
"furchbar langsam" ist schwer zu beziffern, aber ziemlich sicher weniger als 1/20 des Kabelnetzes. Da das Funknetz nur 54MBit hat, wird also höchstens 1/10 der Kapazität genutzt
 
M

maki

Gast
Liegt imho nicht an deinem programm, sondern am WLAN.
Bei WLAN gilt: 54 Mbit ist der Bruttowert, unter idealen Bedingungen sind das meist nicht mehr als 5-10 MBit netto.
300 MBit WLAN sind übrigens unter idealen Bedingungen nur 100MBit netto.

Kannst dir auch mal den Wikipedia Artikel dazu durchlesen: Wireless Local Area Network ? Wikipedia
 

Kr0e

Gesperrter Benutzer
Übertrag doch mal ne Datei mit Windows... WEnns nicht schneller geht, kannst du mit java uach nciht mehr rausholen...
 
M

maki

Gast
Übertrag doch mal ne Datei mit Windows... WEnns nicht schneller geht, kannst du mit java uach nciht mehr rausholen...
estimation.png

*g*
 

Empire Phoenix

Top Contributor
uii der gute xkcd ^^

Was helfen könnte wäre bei den einen algorithmus wie auch immer der hias auschalten der bei fehlern kurz pauseiert (nagels? nables?) weiß das es geht aber nicht mehr wie.

Am rande windows ist ziemlich inneffizient was das protokoll angeht, bei datenfehlern
 

Kr0e

Gesperrter Benutzer
Hallo Empire Phoenix,

ich höre in deiner Aussage eine Abneigung gegen Microsoft :D Geht mir ähnlich. Dennoch ist dein Vorwurf Unsinn. Windows ist nicht ineffizient im Allgemeinen. Ich würde es dann deiner Stelle differenzieren. Win 2000 / XP mag durchaus ein schlechtes Protokoll noch besitzen, aber die sind ja auch schon Jahre alt (Win7 z.B. ist sehr effizient aus meiner Sicht als User). Außerdem wüsste ich gern, wie du auf sowas generell kommst :

"Am rande windows ist ziemlich inneffizient was das protokoll angeht, bei datenfehlern "

Reines Bauchgefühl ?! Du hast ja wohl kaum den Source dazu gesehen, wenn doch.. Schick ihn bitte!
So eine Aussage bringt den TO wirklich kein Stück weiter.

Dein anderer Vorschlag (Nagle) dürfte IMHO keinen Vorteil bringen, ganz im Gegenteil! Eher Nachteile... Der Alg. macht folgendes:
Er wartet bis genug Daten zum Senden anliegen, damit ein TCP Paket mit einer Mindestgröße der MTU (Maximum Transfer Unit)
verschickt werden kann und somit der FlowControl hilft. (Weniger Ack-Befehle, die hin und her gesendet werden müssen)
Von daher solltest du mal lieber schauen, ob der Nagel-Alg. bei dir vlt. aus ist...

Ansonsten meinte ich mit "Schau mal wie schnell es bei Windows ist" nicht die Zeit die beim Kopiertvorgang steht, es gibt ja auch die Uhr rechts unten ;)

Aber lange Rede kurzer Sinn. WLAN ist und bleibt eben einfach lahm und ineffizient. Da kann dann Windows auch nichts für ;)

Gruß,

Christopher

PS: Aber jetzt mal abgesehen vom Netzwerk. Dein Code ist sowieso nicht der effizienteste, sonder neine Standardlösung aus dem Lehrbuch =P. Wenn du effizient empfangen und senden willst, solltest du den Zugriff auf deine Festplatte nicht im selben Thread durchführen, wie den Zugriff aufs Netzwerk (Socket). Beides sind synch. IO-Operationen die jeweils relativ lange brauchen.

Am besten wäre ein "HardDiskThread" oder so, der aus einer Liste Buffers liest, die mit einer ID versehen sind und die dann in seinem Thread der Reihe nach auf die HD schreibt. Bei Festplatten solltest du außerdem einen größeren Puffer beim BufferedStream verwenden als 8192 kb (Standard beim BufferedStream) . 128k wären bei heutigen Festplatten schon eher vernüftig. Der Lesekopf muss sonst ständig hin und her springen, was hohe Latenzen bedeutet, da es ein mechanischer vorgang ist.

Beim Schreiben auf den Socket machst du es dann ähnlich. Bau dir ein kleines Eventsystem und wenn z.b. dann 128k von der HDD gelesen wurden, gib sie in einen Netzwerksendethread, der das gleiche umgekehrt macht.

Das ist die effizienteste Lösung aus Softwaresicht. Der Rest ist Hardwareproblematik auf die du keinen Einfluss hast.
Natürlich kannst du nun noch ZIPStreams nutzen, dann wird die Übertragung nochmal effizienter ... etc...
 
Zuletzt bearbeitet:

Kr0e

Gesperrter Benutzer
Aber vergiss eines nicht! Wenn du mit Java Daten über TCP austauschst, dann nutzt du die Winsocks.
Deine Kritik (Die bei <= XP berechtigt ist...), dass das Protokoll ineffizient sei, bezieht sich dann aber konkret auf die TCP Impl. von Windows und nicht auf diesen Dateitransferdialog. Womit man zum Schluss kommt, dass ein Kopiervorgang mit dem Dialog genauso "ineffizient" ist, wie eine Dateiübertragung mit Java. Das bei TCP-Paketverlust Win XP schlecht agiert, trifft dann acuh auf Java zu leider. Somit wäre der Test (Wie lange Windows zum Kopieren braucht) schon berechtigt!

Und am Rande... Paketverlust ist bei WLAN häufiger als Paketankunft :D Errinnert mich iwie an Hermes :D
 

homer65

Top Contributor
Was imho etwas bringen könnte, wäre die Daten vor und nach der Übertragung zu komprimieren.
Ist die Frage, ob sich der Aufwand lohnt?
 

Kr0e

Gesperrter Benutzer
Hallo Homer65 schau mal in meinen vorletzten Post, ganz unten.....

Ja, komprimierung bringt definitiv was, aber bedenke, dass die CPU-Last erhöht wird. Bau am Besten ne FUnktion ein "WLAN-Betrieb (Komprimierung)".

Mit ZIP bekommst du (Je nach Datentyp), 50 % der Größe, bei Texten fast bis zu 80 %. Sprich Chatnachrichten könnten sich lohnen...
 

tulius

Mitglied
PS: Aber jetzt mal abgesehen vom Netzwerk. Dein Code ist sowieso nicht der effizienteste, sonder neine Standardlösung aus dem Lehrbuch =P. Wenn du effizient empfangen und senden willst, solltest du den Zugriff auf deine Festplatte nicht im selben Thread durchführen, wie den Zugriff aufs Netzwerk (Socket). Beides sind synch. IO-Operationen die jeweils relativ lange brauchen.

Am besten wäre ein "HardDiskThread" oder so, der aus einer Liste Buffers liest, die mit einer ID versehen sind und die dann in seinem Thread der Reihe nach auf die HD schreibt. Bei Festplatten solltest du außerdem einen größeren Puffer beim BufferedStream verwenden als 8192 kb (Standard beim BufferedStream) . 128k wären bei heutigen Festplatten schon eher vernüftig. Der Lesekopf muss sonst ständig hin und her springen, was hohe Latenzen bedeutet, da es ein mechanischer vorgang ist.

Beim Schreiben auf den Socket machst du es dann ähnlich. Bau dir ein kleines Eventsystem und wenn z.b. dann 128k von der HDD gelesen wurden, gib sie in einen Netzwerksendethread, der das gleiche umgekehrt macht.

Das ist die effizienteste Lösung aus Softwaresicht. Der Rest ist Hardwareproblematik auf die du keinen Einfluss hast.
Natürlich kannst du nun noch ZIPStreams nutzen, dann wird die Übertragung nochmal effizienter ... etc...

Danke für den Tipp, werd ich mir mal anschauen.

Von Komprimierung halte ich nicht viel, denn es geht hier vor allem um die Übertragung großer Dateien und Ordner
Das sind typischerweise Dinge wie Bilder und Videos, die sind ja ohnehin schon komprimiert.
Ich hatte mal nen Zip-Stream reingehängt - hat nur die CPU hochgetrieben und kaum 1% gespart.
 

Kr0e

Gesperrter Benutzer
Ja, bei Mediendateien wurde alles rausgeholt, und für 1% hohe CPU-Lasten lohnt nicht.

Und wie gesagt: WLAN ist eher eine Zufallsübertragung als ein gut nutzbares Übertragungsystem. Pakete müssen andauernd neu angefordert werden. Die Antennen werden zu klein und zu billig gebaut und empfangen deshalb nur Mist.
Mein Vater hat mal eine selbst gebaut (Ist kein Witz!). Es gibt viele Bauanleitungen, ist granicht mal schwer und billig obendrein. Wenn solche Richtantennen korrekt ausgerichtet sind, sind 40-50 mbit in der Tat möglich. Sogar durch 2 Holzdecken hindurch (PC steht im Keller). Mit standard Antenne gab es kein Netzwerk :D Die Technik ist heir noch in den Kinderschuhen... Liegt also nicht an deiner Software ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I ActiveMQ-Messages übers Netzwerk Netzwerkprogrammierung 13
M Socket Netzwerk Übertragung zwischen 4 Clients Netzwerkprogrammierung 2
temi (Netzwerk-) Kommunikation zwischen Anwendungen. Wie? Netzwerkprogrammierung 5
W Das Netzwerk entfernen mit Wifi Manager Netzwerkprogrammierung 1
F Neuronales Netzwerk - Genetischer Algorithmus Netzwerkprogrammierung 0
windl Sporadische Aussetzer im Netzwerk Netzwerkprogrammierung 10
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
MaxG. Netzwerk Ping falsches ergebnis Netzwerkprogrammierung 7
T Netzwerk Login Felder ansprechen Netzwerkprogrammierung 1
B Netzwerk - Fernsteuerung Netzwerkprogrammierung 1
S Netzwerk-Framework gesucht Netzwerkprogrammierung 6
J Hilfe beim programmiern einer App zur Anmeldung im Wlan-Netzwerk Netzwerkprogrammierung 0
C Netzwerk Portzuweisungsproblem Netzwerkprogrammierung 0
I PingPong Spiel übers Netzwerk Netzwerkprogrammierung 1
M Verbindung zwischen zwei Pc in dem Selben Netzwerk Netzwerkprogrammierung 8
M PongSpiel Netzwerk Netzwerkprogrammierung 1
D Geräte im Lokalen netzwerk auflisten Netzwerkprogrammierung 1
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
I Netzwerk FileShare Program Netzwerkprogrammierung 2
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
D Ermitteln ob WLAN-Netzwerk UDP unterstützt Netzwerkprogrammierung 1
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
B WebSocket Verbindungsaufbau aus localen Netzwerk Netzwerkprogrammierung 2
S Bilder durch's Netzwerk usw ... Netzwerkprogrammierung 10
Kr0e Dezentrales Soziales Netzwerk Netzwerkprogrammierung 48
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
vandread Zugriff auf Soziales Netzwerk mittels Java? Netzwerkprogrammierung 4
P Automatische Host suche im Netzwerk Netzwerkprogrammierung 3
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
S Netzwerk Verbindungsproblem mit Cajo Netzwerkprogrammierung 5
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
J Komplexes Netzwerk-Spiel im Internet Netzwerkprogrammierung 13
J ObjectInputStream im Netzwerk Netzwerkprogrammierung 8
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
A java im netzwerk anderen rechner runterfahren Netzwerkprogrammierung 3
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
M Netzwerk Programmierung Netzwerkprogrammierung 2
F Netzwerk-Designkonzept Netzwerkprogrammierung 2
D Ring-Netzwerk - wie fange ich an? Netzwerkprogrammierung 3
X Password übers Netzwerk schicken jPasswordField Netzwerkprogrammierung 2
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
c_sidi90 Alle Rechner im Netzwerk ermitteln Netzwerkprogrammierung 17
D Netzwerk-To-Do-Liste Netzwerkprogrammierung 5
Semox Socket Selbstgeschriebenen Webserver im lokalen Netzwerk publizieren? Netzwerkprogrammierung 4
S Socket nach anderen clients im netzwerk suchen Netzwerkprogrammierung 3
G Netzwerk Speed checken Netzwerkprogrammierung 3
L Socket Socketverbindung nur im lokalen Netzwerk Netzwerkprogrammierung 12
F Char über Netzwerk senden Netzwerkprogrammierung 6
P SocketServer im lokalen netzwerk suchen Netzwerkprogrammierung 2
I Objekte über das Netzwerk Netzwerkprogrammierung 5
B RMI RMI, Callback und Netzwerk Netzwerkprogrammierung 6
agent47 IP Adressen im Lokalen Netzwerk Scannen Netzwerkprogrammierung 7
S Netzwerk und Objekte Netzwerkprogrammierung 5
G Netzwerk IP Frage Netzwerkprogrammierung 4
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
W funktionen übers netzwerk nutzen Netzwerkprogrammierung 4
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
M upnp Device-Discovery im Netzwerk Netzwerkprogrammierung 5
T Administration von Software auf Clients im Netzwerk Netzwerkprogrammierung 6
H MySQL übers Netzwerk Netzwerkprogrammierung 9
A Probleme mit kleinem Netzwerk Programm Netzwerkprogrammierung 30
T Pfadangabe beim kopieren übers Netzwerk Netzwerkprogrammierung 5
G Verschlüsselte Strings über Netzwerk verschicken Netzwerkprogrammierung 19
D robustes Netzwerk Netzwerkprogrammierung 2
N HTML-Übertragung im lokalen Netzwerk mit Java - wie? Netzwerkprogrammierung 6
G Datei performant im Netzwerk verschieben Netzwerkprogrammierung 4
D BufferedImage über das Netzwerk senden Netzwerkprogrammierung 2
E Netzwerk Fehlererkennung Netzwerkprogrammierung 11
M Pc's im Netzwerk auflisten Netzwerkprogrammierung 2
T Welches Netzwerk ist am bestern für. Netzwerkprogrammierung 2
ModellbahnerTT Problem feste String ins Netzwerk zu geben Netzwerkprogrammierung 5
A IRC-Server für das lokale Netzwerk? Netzwerkprogrammierung 12
TheJavaKid Anzahl der Server im Netzwerk Netzwerkprogrammierung 7
R Spiel auf Netzwerk auslegen? Netzwerkprogrammierung 10
R Applet & Netzwerk Netzwerkprogrammierung 4
K netzwerk durchsuchen Netzwerkprogrammierung 10
A array übers netzwerk (anfänger) Netzwerkprogrammierung 8
T Möglichkeit über das Netzwerk eine Funktion zu starten? Netzwerkprogrammierung 2
flashfactor Dateien im Netzwerk kopieren Netzwerkprogrammierung 2
R File chooser übers Netzwerk Netzwerkprogrammierung 3
A Betriebssystem über Netzwerk ermitteln Netzwerkprogrammierung 11
B Netzwerk-IP´s sammeln Netzwerkprogrammierung 16
S Netzwerk übers Internet Netzwerkprogrammierung 30
J Brauche hilfe bei Projekt: Netzwerk Chatprogramm Netzwerkprogrammierung 12
M anpingen, liste aller IPs im netzwerk erhalten Netzwerkprogrammierung 5
S Spiel über Netzwerk. Netzwerkprogrammierung 7
O wie schnell kann java netzwerk sein? Netzwerkprogrammierung 7
D Netzwerk Betrachtung mit vielen Clients Netzwerkprogrammierung 2
D Netzwerk Game, bitte hilfe. Netzwerkprogrammierung 2
L netzwerk mit thread Netzwerkprogrammierung 3
B Netzwerk simulieren Netzwerkprogrammierung 2
8 ByteArray per Netzwerk verschicken Netzwerkprogrammierung 6
P Serialialiserte Objekte übers Netzwerk verschicken Netzwerkprogrammierung 9
T Client-Authorisierung-Netzwerk Netzwerkprogrammierung 4
G Verzeichnis eines Rechners übers Netzwerk auslesen Netzwerkprogrammierung 5
B Netzwerk Dokumentation Netzwerkprogrammierung 2
G MySQL über Netzwerk --> Problem Netzwerkprogrammierung 13
M Netzwerk spiel??? Netzwerkprogrammierung 9
B Nachrichten über das Netzwerk verschicken Netzwerkprogrammierung 3
W Problem mit HTTP-Dateiübertragung Netzwerkprogrammierung 6

Ähnliche Java Themen


Oben