Ich habe ein Programm geschrieben, mit dem ich 2 Ordner auf 2 verschiedenen PCs abgleiche und auf beiden PCs dann immer die neuesten Dateien habe. Bisher habe ich immer jedes Byte einzelon gelesen, gesendet und geschrieben, was auch perfekt funktioniert hat. Aber das ist mir doch ein wenig zu langsam
Also wollte ich die Datei komplett in einen byte[] buffer schreiben, um diesen dann komplett senden zu können und wieder zu schreiben, was die Geschwindigkeit wohl sehr erhöht.
Gleich bei dem ersten Versuch ist mir aufgefallen, dass der gesendete Buffer nicht größer als 65536 sein kann, da nur so viel auf einmal gesendet bzw. empfangen wird (in.read() war immer maximal 65536). Also habe ich jetzt versucht den Buffer in solche kleine Stückchen zu zerteilen und diese dann zu senden.
Dies habe ich so realisiert:
Senden:
Empfangen:
filein und fileout sind die FileInput/OutputStreams zur lokalen Datei. os und is sind die Input/OutputStreams über den Socket. length ist die Länge der Datei, die vorher über einen String an den Empfänger gesendet wird.
Bis zu dem Zeitpunkt des Sendens sind alle gesendeten und empfangenen Dateien vollkommen richtig. Aber bei Dateien größer als 65536 Bytes funktioniert mein Programm nicht richtig.
Hier einmal die Ausgabe beider programme:
Sender:
Erst wird der übertragende String ausgegeben:
Dateiname.endung;lastModified();length()
Nur zur Kontrolle habe ich diese hier mal ausgeben lassen.
Alt+Ziffern.odt ist 20,1kb groß, wird aber geschrieben als 64KB groß. Ich denke, dass das an dem Buffer liegt, der zum Schluss eh nur lehr ist. Das kann ich aber (hoffe ich mal) auch alleine lösen.
Angebot... ist 137KB groß und bei dieser Datei gibt, wie man sieht, Fehler.
Wie man an dem Konsolenoutput gut sehen kann, wird weniger gelesen als geschrieben über den Socket.
Woran liegt das?
mfg
BH16
PS: Ich weiß, dass es viele Beispiele dafür gibt und ich diese einfach copy/pasten könnte, aber mir ist der Lerneffekt lieber, weswegen ich jetzt hier frage. Ich bin desweiteren schon seit mehr als 7 Stunden dabei NUR dieses eine Problem zu lösen und habe es auch schon über einen DataI/OS probiert, wobei da genau das selebe Problem mit den 65536 Bytes war.
Also wollte ich die Datei komplett in einen byte[] buffer schreiben, um diesen dann komplett senden zu können und wieder zu schreiben, was die Geschwindigkeit wohl sehr erhöht.
Gleich bei dem ersten Versuch ist mir aufgefallen, dass der gesendete Buffer nicht größer als 65536 sein kann, da nur so viel auf einmal gesendet bzw. empfangen wird (in.read() war immer maximal 65536). Also habe ich jetzt versucht den Buffer in solche kleine Stückchen zu zerteilen und diese dann zu senden.
Dies habe ich so realisiert:
Senden:
Java:
byte[] buffer = new byte[(int)files[i].length()];
filein.read(buffer);
while (buffer.length != 0) {
if (65536 >= buffer.length) {
os.write(buffer);
buffer = Arrays.copyOfRange(buffer, 0, 0);
} else {
buffer = Arrays.copyOfRange(buffer, 65535, buffer.length);
os.write(buffer);
}
System.out.println(buffer.length);
}
Empfangen:
Java:
byte[] buffer = new byte[65536];
int len = 0;
while (len < length) {
int len1 = is.read(buffer);
System.out.println(len1);
len+=len1;
System.out.println(len + " " + length);
fileout.write(buffer);
buffer = new byte[65536];
}
filein und fileout sind die FileInput/OutputStreams zur lokalen Datei. os und is sind die Input/OutputStreams über den Socket. length ist die Länge der Datei, die vorher über einen String an den Empfänger gesendet wird.
Bis zu dem Zeitpunkt des Sendens sind alle gesendeten und empfangenen Dateien vollkommen richtig. Aber bei Dateien größer als 65536 Bytes funktioniert mein Programm nicht richtig.
Hier einmal die Ausgabe beider programme:
Code:
Empfänger:
Alt+Ziffern.odt;1341776898972;20602
Recieving D:\TEST_recieve\Alt+Ziffern.odt
20602
20602 20602
File written
Angebot44441 (1).pdf;1341776899721;140298
Recieving D:\TEST_recieve\Angebot44441 (1).pdf
65536
65536 140298
18455
83991 140298
9260
93251 140298
Sender:
Code:
Alt+Ziffern.odt;1341776898972;20602
Sending D:\Daten\Alt+Ziffern.odt
0
Angebot44441 (1).pdf;1341776899721;140298
Sending D:\Daten\Angebot44441 (1).pdf
74763
9228
0
Busplan.ods;1341776900018;14465
Erst wird der übertragende String ausgegeben:
Dateiname.endung;lastModified();length()
Nur zur Kontrolle habe ich diese hier mal ausgeben lassen.
Alt+Ziffern.odt ist 20,1kb groß, wird aber geschrieben als 64KB groß. Ich denke, dass das an dem Buffer liegt, der zum Schluss eh nur lehr ist. Das kann ich aber (hoffe ich mal) auch alleine lösen.
Angebot... ist 137KB groß und bei dieser Datei gibt, wie man sieht, Fehler.
Wie man an dem Konsolenoutput gut sehen kann, wird weniger gelesen als geschrieben über den Socket.
Woran liegt das?
mfg
BH16
PS: Ich weiß, dass es viele Beispiele dafür gibt und ich diese einfach copy/pasten könnte, aber mir ist der Lerneffekt lieber, weswegen ich jetzt hier frage. Ich bin desweiteren schon seit mehr als 7 Stunden dabei NUR dieses eine Problem zu lösen und habe es auch schon über einen DataI/OS probiert, wobei da genau das selebe Problem mit den 65536 Bytes war.