Witam,
Muszę napisać przesyłanie plików (między socketami), gdzie plik będzie przesyłany w postaci bloków o dowolnej wielkości.
Generalnie sprawa wygląda prosto: stworzyć tablicę bajtów o wielkości x i kolejno zapisywać do niej fragment pliku i wysyłać przez gniazdko.
np.
File f = new File("plik.jpg");
int rozmiar = (int) f.length();
int blok = 1000;
int iloscBlokow = rozmiar / blok;
byte[] frag = new byte[blok];
FileInputStream fis = new FileInputStream(f);
for (int i = 0; i <= iloscBlokow; i++) {
fis.read(frag, 0, frag.length);
output.write(frag, 0, frag.length);
output.flush();
}
natomiast strona odbierająca podobnie, ale:
Np.
for (i = 0; i <= iloscBlokow; i++) {
input.read(fragBajty, 0, fragBajty.length);
fos.write(fragBajty, 0, fragBajty.length);
}
Obiekty input i output to obiekty klas InputStream oraz OutputStream.
I przy tym dzieją się rzeczy dla mnie nie zrozumiałe...
Jeśli blok wynosi (mniej więcej) <= 1000 to nie ma żadnego problemu.
Jeśli blok ustawiam na wartość kilkutysięczną-kilkunastotysięczną, koniecznie muszę dołożyć przynajmniej Thread.sleep(1) po metodzie write obiektu output po stronie wysyłającej. (tak jakby strona odbierająca nie nadążała z odbieraniem danych)
Jeśli blok wynosi kilkadziesiąt tysięcy np 70 000 to opóźnienie muszę zwiększyć, ale nie zauważyłem żadnej zależności o ile.
Wiem, że problem jest przedstawiony bardzo chaotycznie ale zupełnie nie rozumiem co tam się dzieje.
Myślałem, że taki sposób przesyłania tablic bajtów będzie działał w ten sposób: wysyłam tablicę o długości X, odbieram tablicę o długości X i tak w kółko, aż skończy się plik.
Natomiast jeśli przesyłam (bez żadnego bawienia się w opóźnienia) tablicę o wielkości 65000, to odbiorca w pierwszej iteracji odbiera tablicę o wielkości np około 20 000, w drugiej około 30 000, itd
A pliki przesyłają się z błędami.
Czy ktoś ma pomysł w czym tkwi problem i jak spróbować go rozwiązać?