Wznawianie transmisji pliku

0

Czesc jest ciagle w trakcie robienia serwera. Mam juz server-klient dajacy mozliwosc wysylania plikow(push), sciagania plikow od wszystkich klientow posiadajacych plik, sciaganie pliku od konkretnego klienta.
Musze jeszcze zaimplementowac dwie rzeczy:
-Wznawianie transmisji pliku w przypadku jej przerwania lub rozłączenia

  • Dodatkowo aplikacja może pracować pod nadzorem protokołu UDP

Nie mam pomyslu jak wznawiac połączenie w programie. Zasada wysylania jest prosciutka tworze tablice byte[] wrzucam do niej Files.readAllBytes(file.toPath()) i wysylam (DatatOutputStream) dos.write(byte), a client pobiera plik funkcja (DataInputStream)dis.readFully(bytes); Czy ma ktos pomysl albo moze nakierowac z tym wznawianiem transmisji?

A po drugie co to znaczy pod nadzorem protokolu UDP. Przeciez tu nie ma zadnej kontroli? Co prawda na razie pisalem tylko TCP wiec moze czegos nie wiem :D

1

UDP to strzał w nogę, bo nigdy nie będziesz wiedział czy plik jest cały (możesz sprawdzać checksumy ale to się mija z celem)

0

No wlasnie wiem dlatego ten dodatek oleje. Ale wazniejsze jest dla mnie co zrobic do wznawiania transmisji. Jakas klasa chociaz albo funkcja cokolwiek, serdecznie prosze kolegow programistow o pomoc:D

0

Raczej nie pobierałbym całego pliku na raz (Files.readAllBytes(file.toPath())), bo co w przypadku, gdy np. plik będzie miał kilka gigabajtów? Zastosowałbym np. RandomAccessFile i wysyłałbym jakimiś pakietami, np. po 1MB, na tej zasadzie, że przeczytasz fragment, wysyłasz, czytasz kolejny, wysyłasz. Wtedy po zerwaniu będziesz wiedział, w którym miejscu pliku byłeś w momencie przerwania i po ponownym podłączeniu będziesz mógł od tego miejsca wysyłać.

0

Niestety duze pliki nie wchodza. Przez to pojawil mi sie kolejny problem ktory mysle ze moze pomoc mi wykminic podzial bytow na paczki. Jak z duzego pliku moge zrobic jego md5(podobno przestarzale ale projekt to projekt). Wykozystuje tu tego nieszczesnego .readAllBytes i powyzej dwoch giga pojawia sie exception OutOfMemoryError ze za nie mozna stworzyc tak duzej tablicy.

    String getMd5(String str){
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {}
        Path path = Paths.get(str);
        byte[] fileByte = null;
        try {
            fileByte = Files.readAllBytes(path);
        } catch (IOException e) {}
        md5.update(fileByte);
        byte[] b = md5.digest();
        StringBuffer sb = new StringBuffer();
        for(byte i : b){
            sb.append(Integer.toHexString(i & 0xff).toString());
        }
        return sb.toString();
    }

niestety RandomAccesFile też będzie mi to zapisywał do tablicy(readByte) a wieksza niz int tablica byc nie moze:(
Moze jakos dynamicznie wyznaczac ta md5 ale nie mam pojecia jak.

0

Wykminlem cos takiego z nio ale teraz jest to strasznie wolne

    public String getMd5(String str){
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(str);
        } catch (FileNotFoundException e1) {}
        if(fis==null){
            return null;
        }
        MessageDigest md = null;
            try {
                md = MessageDigest.getInstance("MD5");
            } catch (NoSuchAlgorithmException e) {}
            FileChannel channel = fis.getChannel();
            ByteBuffer buff = ByteBuffer.allocate(2048);
            try {
                while(channel.read(buff) != -1){
                    buff.flip();
                    md.update(buff);
                    buff.clear();
                }
            } catch (IOException e) {}
            byte[] hashValue = md.digest();
            StringBuffer sb = new StringBuffer();
            for(byte i : hashValue){
                sb.append(Integer.toHexString(i & 0xff).toString());
            }
            return sb.toString();
    }
0

Nie możesz wykorzystać do tego jakieś biblioteki? Biblioteki, która ogarnie to za Ciebie. Np. coś na zasadzie rsync
https://pl.wikipedia.org/wiki/Rsync

czyli np.:
https://sourceforge.net/projects/jazsync/
http://jarsync.sourceforge.net/

lecz pewnie istnieją też lepsze biblioteki. Wesołych

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0