15. diel - Java chat - Klient - Zoznámenie sa s kostrou aplikácie
V minulých lekciách sme vytvorili základné Java server, ktorý sme dokončili lekcií Java server - Vylepšenie systému pluginov . Počnúc dnešnej lekcií začneme tvoriť sľubovaný chat ako ukážkovú aplikáciu využívajúce tento univerzálny Java server.
Architektúra
Klienta budeme písať samozrejme v Jave v JavaFX frameworku. Budeme sa držať MVC architektúry, aby sme udržali čitateľný kód. Všetky pohľady budeme písať do samostatných fxml súborov. Logika bude v modeli a všetko sa bude prepájať cez controller.
Funkcie
Chat bude obsahovať tie najzákladnejšie funkcie pre komunikáciu:
- odoslanie správy
- notifikácia, že používateľ začal písať správu
Nebudem tu implementovať žiadne pridávanie priateľov k jednotlivým kontaktom. Každý užívateľ si bude môcť písať s každým. Nebude tu tiež žiadny proces registrácie / prihlásenie. Pri pripojení na server iba užívateľ zadá svoje meno / prezývku, pod ktorým bude na chate vystupovať. Pokiaľ bude záujem, implementujeme aj end2end šifrované posielanie správ.
Kostra klienta
Aby sme sa nezdržovali, vytvoril som základnú kostru klienta, do ktorej budeme postupom času dopĺňať kód. Stiahnite si prosím archív priložený na konci lekcie, ktorý obsahuje kostru klienta (okrem už vyplneného kódu z dnešnej lekcie pre prípad, že by vám niečo nefungovalo).
Archív obsahuje:
- kód z predchádzajúcich lekcií o tvorbe serveru
- kostru klienta v module
client
Modul client
obsahuje nasledujúce súborovú štruktúru:
V balíčku controller
sa nachádza triedy, ktoré reprezentujú
kontrolér pre jednotlivú funkcionalitu. MainController
bude
obsahovať logiku hlavného okna, ktoré sa zobrazí po zapnutí aplikácie.
ConnectController
bude spravovať okno, v ktorom sa budeme
pripájať k serveru. Balíček model
bude obsahovať všetky
modely, ktoré počas aplikácie vytvoríme a budeme používať. V balíčku
service
sa budú nachádzať triedy starajúci sa o komplexnejšie
funkčnosť, ako napríklad ChatService
, ktorá bude obsahovať
metódy pre odosielanie správ.
Trieda ChatApp
inicializuje JavaFX aplikáciu. Triedu
LanServerFinder
sme vytvorili v minulej lekcii a v budúcnosti ju
použijeme na hľadanie serverov v lokálnej sieti. Zložka
resources
obsahuje ďalšie súbory potrebné pre beh aplikácie.
Zatiaľ sa tu nachádzajú iba fxml súbory, ktoré slúžia
ako view pre jednotlivé kontrolery.
Zoznámenie sa s aplikáciou
Ak aplikáciu spustíme príkazom ./gradlew :client:jfxRun
,
zobrazí sa nám základné okno aplikácie.
Toto okno je definované v súbore main.fxml
a jeho kontrolér
sa nachádza v triede MainController
.
Okno sa skladá z troch častí:
- menu: obsahuje iba tlačidlá pre pripojenie k serveru a ukončenie aplikácie
- vľavo sa nachádza listview, v ktorom sa budú zobrazovať pripojenie užívatelia
- vpravo je komunikačný okno, v ktorom sa pre každého užívateľa vytvorí samostatná záložka pre komunikáciu
Zobrazenie lokálnych serverov
Druhé samostatné okno, ktoré v aplikácii existuje, sa stará o pripojenie
/ odpojenie k / od servera. Ďalej sa v tomto okne budú zobrazovať servery z
lokálnej siete. Okno, ktoré sa užívateľovi zobrazí, je definované v
súbore connect.fxml
. Kontrolér tohto okna je v triede
ConnectController
. Obrázok výsledného okna je vidieť na
obrázku nižšie.
Okno je rozdelené do troch časti:
- v hornej časti sa nachádza informácie a aktuálne pripojeného servera a tlačidlo odpojiť, ktoré nás odpojí od servera
- v spodnej časti sa nachádza textové polia pre zadanie adresy a portu servera a prezývky, pod ktorú budeme v chate vystupovať; vpravo dole je tlačidlo pre pripojenie k zadanému serveru
- uprostred sa budú zobrazovať všetky nájdené servery v lokálnej sieti
V balíčku controller
sa nachádza celkom tri kontrolery. Dvaja
z nich sme si už odprezentovali a logicky by mal prísť na rad posledná
ChatController
. Tento kontrolér nebude mať vlastné okno,
namiesto toho sa bude zobrazovať v hlavnom okne a bude obsahovať konverzáciu
užívateľov a textové pole pre vytvorenie novej správy s tlačidlom pre
odoslanie správy.
Threadpool
Než začneme s implementáciou konkrétne logiky pre chat klienta,
vytvoríme triedu ThreadPool
, pomocou ktorej budeme ľahko
spúšťať úlohy na pozadí. Triedu umiestnime do balíčka koreňového
balíčka vedľa hlavnej triedy klienta:
package cz.stechy.chat; public final class ThreadPool { public static final ExecutorService COMMON_EXECUTOR = ForkJoinPool.commonPool(); public static final Executor JAVAFX_EXECUTOR = Platform::runLater; public static final ScheduledExecutorService SCHEDULER = Executors.newSingleThreadScheduledExecutor(); static void shutDown() { COMMON_EXECUTOR.shutdown(); SCHEDULER.shutdown(); try { COMMON_EXECUTOR.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } try { SCHEDULER.awaitTermination(5, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } private ThreadPool() { throw new AssertionError(); } }
V triede sa nachádzajú tri verejné triedny konštanty:
COMMON_EXECUTOR
- Všeobecný threadpool na štandardné úkonyJAVAFX_EXECUTOR
- Executor pre vykonanie kódu v hlavnom vlákneSCHEDULER
- Executor pre neskoršie spustenie úlohy
Metódou shutdown()
bezpečne ukončíme činnosť jednotlivých
exekútorov. Túto metódu budeme volať pri zatvorení hlavného okna
aplikácie. Metódami shutdown()
nad jednotlivými exekútormi
zahájime proces ukončovania exekútorov. Ak sa ukončenie z nejakého dôvodu
zlyhá do piatich sekúnd, ukončíme je násilne metódou
awaitTermination()
. V triede ChatApp
, kde sa zostavuje
hlavné okno, musíme pridať listener na zatvorenie okna:
stage.setOnCloseRequest(windowEvent -> ThreadPool.shutDown());
Týmto by sme mali hotové zoznámenie sa s kostrou klientskej aplikácie. Nabudúce, v lekcii Kvíz - Propagácia lokálnej sietí v Jave , implementujeme zobrazenie nájdených serverov v lokálnej sieti a pripojenie na server.
V nasledujúcom kvíze, Kvíz - Propagácia lokálnej sietí v Jave, si vyskúšame nadobudnuté skúsenosti z predchádzajúcich lekcií.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 25x (225.32 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java