Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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:

Štruktúra modulu klient pre Java server - Server pre klientskej aplikácie v Jave

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.

Hlavné okno klientskej aplikácie pre Java server - Server pre klientskej aplikácie v Jave

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 pre pripojenie / nájdenie Java servera - Server pre klientskej aplikácie v Jave

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é úkony
  • JAVAFX_EXECUTOR - Executor pre vykonanie kódu v hlavnom vlákne
  • SCHEDULER - 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

 

Predchádzajúci článok
Java server - Vylepšenie systému pluginov
Všetky články v sekcii
Server pre klientskej aplikácie v Jave
Preskočiť článok
(neodporúčame)
Kvíz - Propagácia lokálnej sietí v Jave
Článok pre vás napísal Petr Štechmüller
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity