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