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