IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

2. diel - Java server - Parametre servera

V minulej lekcii, Java server - Úvod , sme si pripravili základnú štruktúru projektu. V dnešnom tutoriále začneme tvoriť serverovú časť, konkrétne spracovanie parametrov. Všetky triedy, ktoré vytvoríme, sa budú vzťahovať k modulu server, ak nie je uvedené inak.

Parametre servera

Server bude jednoduchá konzolová aplikácie, takže všetky nastavenia budeme musieť odovzdať pomocou parametrov pri spustení programu. Časom pridáme aj jednoduché interaktívne ovládanie.

Parametre budú nasledujúce:

  • číslo portu: definuje, na akom porte bude náš server počúvať
  • počet klientov: maximálny počet pripojených klientov, ktorí budú aktívne komunikovať so serverom
  • veľkosť čakacie fronty: pokiaľ bude na serveri maximálny počet klientov, tak sa zaradí do čakacej fronty

Jednotlivé parametre budú na príkazovom riadku oddelené čiarkou. Každý parameter sa bude skladať z dvojice -název=hodnota. Výsledný formát teda bude nasledujúci:

-port=6298, -clients=2, -max_waiting_queue=5

Keď sme si zadefinovala, ako budú vyzerať parametre servera, môžeme ich implementovať do triedy, ktorá sa nám bude starať o parsovanie parametrov z príkazového riadku. Vytvoríme nový balíček s názvom cmd, v ktorom vytvoríme rozhraní IParameterProvider. Toto rozhranie bude definovať metódy, pomocou ktorých budeme získavať parametre.

package cz.stechy.chat.cmd;

public interface IParameterProvider {

    String DEFAULT_STRING = "";
    int DEFAULT_INTEGER = -1;

    default String getString(String key) {
        return getString(key, DEFAULT_STRING);
    }

    String getString(String key, String def);

    default int getInteger(String key) {
        return getInteger(key, DEFAULT_INTEGER);
    }

    int getInteger(String key, int def);
}

V rozhraní sme nadefinovali celkom 4 metódy. Dve pre získanie textu a dve na získanie čísla. Využívame tu možnosti defaultných metód v rozhraní, aby sme nemuseli implementovať zbytočne všetky metódy.

Teraz si v rovnakom balíčku vytvoríme triedu, ktorá bude toto rozhranie implementovať, nazvime ju CmdParser. Nadefinujeme si konštanty reprezentujúci názvy jednotlivých parametrov:

public static final String PORT = "port";
public static final String CLIENTS = "clients";
public static final String MAX_WAITING_QUEUE = "max_waiting_queue";

Ďalej si zadefinujeme Mapu, ktorá bude uchovávať všetky parametre:

private final Map<String, String> map = new HashMap<>();

Vytvoríme konštruktor triedy, ktorý bude ako parameter prijímať vstupné argumenty z príkazového riadku:

public CmdParser(String[] args) {
    for (String arg : args) {
        arg = arg.replace("-", "");
        String[] raw = arg.split("=");
        map.put(raw[0], raw[1]);
    }
}

V konstruktoru spracujeme jednotlivé parametre. Najskôr sa zbavíme znaku - pred každým názvom parametra, následne rozdelíme jednotlivé dvojice název=hodnota do poľa o dvoch hodnotách. Tieto hodnoty vložíme do mapy.

Nakoniec zostáva implementovať metódy, ktoré po nás vyžaduje rozhranie IParameterProvider:

@Override
public String getString(String key, String def) {
    final String s = map.get(key);
    return s == null ? def : s;
}

@Override
public int getInteger(String key, int def) {
    final String s = map.get(key);
    return s == null ? def : Integer.parseInt(s);
}

Implementácie je veľmi jednoduchá. Z mapy sa získa hodnota, ktorá by mala zodpovedať kľúčmi. Ak táto hodnota neexistuje, vrátime predvolenú hodnotu, inak vrátime hodnotu, ktorá bola získaná z mapy.

Test

Aby sme si overili, že naša trieda funguje ako má, napíšeme si jednoduchý jednotkový test. K vytváraniu testov máme zložku test/. V priečinku test/java/ si vytvoríme zodpovedajúce balíček, teda: cz.stechy.chat.cmd. Tu vytvoríme novú triedu ParametersTest. Najskôr si zadefinujeme konštantu, ktorá bude reprezentovať parametre tak, ako budú prichádzať z príkazového riadku:

private static final String[] PARAMETERS = {
    "-port=6298", "-clients=5", "-max_waiting_queue=5", "name=test"
};

Ďalej si vytvoríme premennú, ktorá bude typu IParameterProvider:

private IParameterProvider parameterProvider;

V setUp() metóde inicializujeme túto premennú:

@Before
public void setUp() throws Exception {
    parameterProvider = new CmdParser(PARAMETERS);
}

Teraz môžeme otestovať, či ak sme správne implementovali rozhranie. Vytvoríme si teda štyri testovacie metódy. Dve pre získanie textu a dve pre získanie čísla:

@Test
public void getStringTest() {
    final String key = "name";
    final String name = "test";
    assertEquals("Chyba, hodnota názvu serveru se neshoduje.", name, parameterProvider.getString(key));
}

@Test
public void getStringNegativeTest() {
    final String key = "unknown";
    final String value = CmdParser.DEFAULT_STRING;
    assertEquals("Chyba, je špatně definovaná výchozí hodnota.", value, parameterProvider.getString(key));
}

@Test
public void getIntegerTest() {
    final String key = "port";
    final int value = 6298;
    assertEquals("Chyba, hodnota portu se neshoduje.", value, parameterProvider.getInteger(key));
}

@Test
public void getIntegerNegativeTest() {
    final String key = "unknown";
    final int value = CmdParser.DEFAULT_INTEGER;
    assertEquals("Chyba, je špatně definovaná výchozí hodnota.", value, parameterProvider.getInteger(key));
}

V prvých metóde je pozitívny test na získanie textu na základe kľúča. Druhá metóda obsahuje negatívny test, ktorý testuje, či ak dostanem predvolenú hodnotu, ak kľúč nie je nájdený. Testy pre získanie čísla sú podobné.

To by bolo pre dnešok všetko. V budúcej lekcii, Java server - Google Guice , implementujeme správu závislostí pomocou knižnice Google Guice.


 

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é 35x (239.95 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Java server - Úvod
Všetky články v sekcii
Server pre klientskej aplikácie v Jave
Preskočiť článok
(neodporúčame)
Java server - Google Guice
Č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