Vytvorte klient-server aplikáciu na kopírovanie súboru.

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

  • Sťahovanie súboru prebieha paralelne cez používateľom daný počet TCP soketov.
  • Kopírovanie prebieha iba zo servera na klienta(ov)
  • Pri spustení servera sa určí, aký súbor bude poskytovaný na kopírovanie – stačí cez konštantu, ale môžu byť aj interaktívnejšie spôsoby, napr. výber súboru cez prehliadač disku.
  • 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č). Vypne znamená, že skončí proces, nie to, že sa len pozastaví. Po opätovnom nadviazaní spojenia medzi serverom a klientom, má klient možnosť pokračovať v dokopírovaní od momentu prerušenia (už stiahnuté časti súboru sa neťahajú znova) opäť paralelne cez rovnaký počet TCP soketov. Pokračovanie kopírovania, ktoré funguje iba ak po prerušení ostane bežať klient aj server je nedostatočné.
  • Pri prerušení kopírovania používateľom sa majú korektne uzavrieť všetky TCP spojenia aj uzavrieť súbory bez chybových hlášok v konzolách. Prerušenie servera môžete realizovať odstrelením procesu. Aj v prípade pádu servera by sa mal klient automaticky alebo cez používateľa (nechávam na vás ako) korektne uzavrieť.
  • Program má byť schopný skopírovať bez problémov na lokálnej sieti, alebo v rámci localhostu aj 1GB súbor pod 1 minútu
  • Ak máte potrebu, môžete využiť dočasný súbor, ktorý využijete na uloženie stavu a korektné pokračovanie kopírovania. Uloženie stavu môže realizovať klient a/alebo server, ak to uznáte za vhodné. Len pozor, že ak ukladáte stav na serveri, treba pamätať na to, že server môže obsluhovať viacero klientov – každému vie poslať ten istý súbor.
  • Požadované vlastnosti
    • projekt využíva na správu vlákien ExecutorService(y) – 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ň:
      • tlačidlo na začatie kopírovania
      • nejaký komponent na nastavenie počtu vlákien pri začatí kopírovania (read-only pri možnosti pokračovania)
      • progressbar znázorňujúci percento a/alebo veľkosť skopírovanej časti dát v MB
      • 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 synchronizé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ý
    • súbor 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 súbor sa korektne dokopíruje celý a bez chýb.
    • 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.