S
sani
Gast
Hallo allerseits!
Ich probiere zwischen zwei Systeme Dateien zu verschieben und benutze dafür die Sockets. Leider funktioniert etwas nicht ganz so, wie ich es mir vorgestellt habe. Ich denke, dass etwas mit Synchronisation nich funktioniert. Denn, wenn ich eine ZIP-Datei (Groesse ca. 400 MB) übertrage, kommt es ab und zu zu einem Durcheinander. Ich schreibe / lese mit DataOutputStream bzw. mit DataInputStream.
Hier noch der Codeauszug von beiden Seiten:
Sender:
Empfänger:
Nun, was mache ich falsch?
Ich probiere zwischen zwei Systeme Dateien zu verschieben und benutze dafür die Sockets. Leider funktioniert etwas nicht ganz so, wie ich es mir vorgestellt habe. Ich denke, dass etwas mit Synchronisation nich funktioniert. Denn, wenn ich eine ZIP-Datei (Groesse ca. 400 MB) übertrage, kommt es ab und zu zu einem Durcheinander. Ich schreibe / lese mit DataOutputStream bzw. mit DataInputStream.
Hier noch der Codeauszug von beiden Seiten:
Sender:
Code:
// Dateilaenge an den Client senden
long fileLaenge = file.length();
dos.writeLong(fileLaenge);
dos.flush();
// Daten aus der Datei lesen und senden
int anzahlZeichenGelesen = fis.read(buffer);
while (anzahlZeichenGelesen != -1)
{
dos.write(buffer, 0, anzahlZeichenGelesen);
dos.flush();
// Daten aus der Datei lesen
anzahlZeichenGelesen = fis.read(buffer);
// Warten, bis die Gegenseite fuer das naechste Datenpaket
// bereit is. Ihre Bereitschaft wird sie durch das Senden einer
// Null (0) signalisieren. Der Bereitschaft-Wert wird hier nicht
// verwertet, da die Methode readInt blockierend.
if (anzahlZeichenGelesen != -1)
{
// Falls nich EOF, warten auf die Gegenseite
paketAbgeholt = dis.readInt();
}
}
// Stream schliessen
fis.close();
Empfänger:
Code:
long fileLaenge = 0;
int paketAbgeholt = 0;
// Filegroesse auslesen
fileLaenge = dis.readLong();
// Anzahl 'voller' Buffers berechnen
long anzahlVollerBuffer = fileLaenge / BUFFERSIZE;
// Daten auslesen und in die Datei schreiben
for (long i = 0; i < anzahlVollerBuffer; i++)
{
dis.read(buffer);
fileOutStream.write(buffer);
// Der Gegenseite melden, dass das naechste Datenpaket
// gesendent werden kann.
// Wenn ich nach jedem Senden den Thread schlafen lege, funktioniert es! Das verzögert aber die Übertragung unheimlich stark bei einer Datei von 400 MB!!!
// try
// {
// Thread.sleep(30);
// }
// catch (InterruptedException e)
// {
// mach was ...
// }
dos.writeInt(paketAbgeholt);
}
// Die uebriggebliebene Bytes lesen und in die Datei schreiben
int restBytes = (int) (fileLaenge - (anzahlVollerBuffer * BUFFERSIZE));
dis.read(buffer, 0, restBytes);
fileOutStream.write(buffer, 0, restBytes);
file = null;
fileOutStream.close();
Nun, was mache ich falsch?