Vytvorte klient-server aplikáciu na kopírovanie adresára.

Na riešenie tohto zadania môžete ako základ použiť projekt https://gitlab.science.upjs.sk/kopr/file_copy

  • Sťahovanie adresára (stromu adresárov a súborov) prebieha paralelne cez používateľom daný počet TCP soketov.
  • Kopírovanie prebieha iba zo servera na klienta
  • Jeden súbor sa presúva vždy len cez jeden soket, po jeho prenesení posiela tento soket ďalší súbor, ak ešte je ďalší, čo treba posielať
  • Toto sťahovanie je prerušiteľné tak, že sa vypne server (simulácia straty spojenia) alebo klient (simulácia toho, že používateľ musí nečakane vypnúť/reštartovať počítač). Po opätovnom nadviazaní spojenia medzi serverom a klientom, má klient možnosť pokračovať v dokopírovaní. Pokračovanie kopírovania, ktoré funguje iba v prípade, že po prerušení musí ostať bežať klient alebo server je nedostatočné.
  • Od momentu prerušenia (už stiahnuté časti súborov sa neťahajú znova) opäť paralelne cez daný počet TCP soketov.
  • Pri prerušení klienta sa musia korektne uzavrieť všetky TCP spojenia aj uzavrieť súbory bez chybových hlášok v konzolách
  • Nie je potrebné programovať prehľadávač disku „na druhej strane“ na výber adresára ani výber cieľového umiestnenia adresára.
  • Pri spustení servera sa určí, aký adresár bude poskytovaný na kopírovanie – stačí cez konštantu
  • Odporúčam nepoužívať vytváranie špeciálnych paketov s hlavičkami, ale posielať cez Socket.getOutputStream().write() po prípadných úvodných dohodách iba dáta. Uzatvorenie streamu sa dá odchytiť cez výnikmku IOException, keď sa zatvorí socket.
  • Program má byť schopný skopírovať bez problémov na lokálnej sieti, alebo v rámci localhostu aj 1GB stredne veľkých súborov pod 1 minútu
  • Požadované vlastnosti
    • projekt musí využívať na správu vlákien Executor – nevytvárate vlastné Thread-y
    • použite aspoň jeden synchronizér
    • odchyťte v úlohe udalosť prerušenia
    • počet dokopy vytvorených TCP spojení počas celej doby kopírovania musí byť rovný počtu TCP Soketov zadaných používateľom s prípadným bonusovým jedným TCP soketom/spojením na manažovanie kopírovania (ak máte potrebu ho použiť) – teda, počas kopírovania žiadne nové TCP spojenia nevznikajú
    • Grafické používateľské rozhranie pre klienta vo frameworku JavaFX obsahujúce aspoň
      • progressbar znázorňujúci percento skopírovania počtu súborov
      • progressbar znázorňujúci percento skopírovanej veľkosti dát v MB
      • nejaký komponent na nastavenie počtu vlákien pri začatí kopírovania (môže byť read-only pri možnosti pokračovania, ak potrebujete)
      • tlačidlo na začatie kopírovania
      • tlačidlo na opätovné pokračovanie v kopírovaní, ak je (pri spustení) zistené, že kopírovanie bolo prerušené (môže ísť o rovnaké tlačidlo ako na začatie kopírovania ak sa mu nastaví popisok na pokračovanie).
  • Zakázané vlastnosti
    • použitie uspatia vlákna na určitý čas namiesto vhodného sychronizéra
    • aktívne čakanie: úloha v cykle testuje prítomnosť hodnoty namiesto blokovaného čakania (uspatia)
    • klient a server bežia ako vlákna rovnakého programu namiesto toho, aby sa spustili ako dva nezávislé programy (procesy)
  • Minimálne požiadavky (pre študentov typu „stačí mi E-čko“):
    • program nesmie mať syntaktické chyby – je skompilovateľný
    • adresár sa skopíruje v danom počte paralelných soketov a skopíruje sa celý bez chýb
    • funguje pokračovanie kopírovania po vypnutí klienta a zapnutí klienta a adresár sa korektne dokopíruje celý a bez chýb
    • pri prerušení kopírovania sa musí prerušiť kopírovanie súborov – nesmie sa čakať kým sa začaté súbory dokopírujú
    • pri pokračovaní kopírovania sa už raz stiahnuté časti súborov nekopírujú znova
    • v kóde sa vyskytuje maximálne jedna zakázaná vlastnosť a je prítomná maximálne raz
    • aspoň myšlienka zvyšných požiadaviek
  • Upozornenie pre plagiátorov: Ak nerozumiete nejakej časti prezentovaného kódu alebo sa v kóde nevyznáte t.j. neviete, kde je naprogramovaná nejaká funkcionalita, ste považovaný(á) za plagiátora(ku) a predmet končíte s Fx, plus budete riešení etickou komisiou.