Lekce 1 - Java server - Úvod
Vítejte u kurzu ze sekce Java, ve kterém si ukážeme, jak vytvořit server pro klientské aplikace. V tomto případě se zaměříme na server pro chat, ale základ bude stejný i pro jiné použití. V této lekci si stanovíme cíle, kterých chceme dosáhnout, popíšeme si použité technologie, a založíme projekt.
Cíle
Jak již bylo řečeno v úvodu, tento kurz si klade za cíl ukázat, že napsat kvalitní server v Javě není až tak těžké, jak by se mohlo zdát. V první polovině kurzu implementujeme základní části, které budou použitelné pro jakoukoliv aplikaci serveru, od chatu po jednoduchý herní server. Druhá polovina se zaměří na samotný chat.
Funkce serveru
Server bude poskytovat následující funkce:
- správa klientů
- zahájení přímé komunikace
- vložení do čekací fronty
- čekací fronta pro případ, že je na serveru příliš mnoho klientů
- snadné nalezení serveru v lokální síti
- snadná rozšiřitelnost pomocí pluginů
- interaktivní komunikace se správcem serveru
Výsledná podoba
Níže můžete vidět výsledného chat klienta. U kontaktů se zobrazuje počet nepřečtených zpráv. Dále indikátor psaní se zobrazuje v tabu. Pokud je konverzace delší, zobrazí se scrollbar.

Použité technologie
Protože se jedná o kurzu v sekci Java, tak celou aplikaci napíšeme právě v Javě. O správu projektu a závislostí se bude starat Gradle a dependency injection nám zajistí Google Guice.
Založení projektu
Začneme založením projektu. K programování doporučuji používat rozumné IDE. Já budu v celém kurzu používat IntelliJ IDEA.
Klikneme tedy v menu na tlačítko File -> New -> Project... Otevře se okno jako je na obrázku níže. V tomto okně zaškrtněte, že chcete, aby se o projekt staral Gradle. Pokud Gradle není v možnosti, je potřeba aktivovat plugin v nastavení: File -> Settings -> Plugins Otevře se okno s nastavením pluginů. Do vyhledávacího políčka zadáme název pluginu "Gradle", zaškrtneme checkbox, klikneme na tlačítko apply a ok. Po restartu prostředí již bude Gradle aktivní. Jazyk vyberte Java (měl by být vybrán ve výchozím nastavení). Pokračujte tlačítkem Next.

V dalším okně je potřeba vyplnit políčka GroupId a ArtifactId. GroupId
představuje balíček, který obvykle reprezentuje firmu/instituci/jedince,
která stojí za aplikací. Já sem obvykle vyplňuji cz.stechy
.
ArtifactId je název aplikace, kterou se snažíme vytvořit. V tomto případě
zadáme jednoduše chat
. Je zde ještě políčko Version. To
udává verzi aplikace. Políčko nechte vyplněno výchozí hodnotou a
pokračujte tlačítkem Next.

Další okno obsahuje nastavení Gradlu. Vše ponechte ve výchozích hodnotách a zaškrtněte checkbox Use auto-import. Pokračujte dál tlačítkem Next.

Následuje poslední okno, ve kterém si nastavíte kořenový adresář projektu. Až budete spokojeni s umístěním projektu, tlačítkem Finish dokončíte jeho zakládání.

Hned po vytvoření projektu se začne inicializovat Gradle.
Struktura projektu
Struktura našeho projektu je vidět na následujícím obrázku.

V adresáři projektu se nacházejí dvě skryté složky:
.gradle/
a .idea/
. V těchto složkách se nacházejí
konfigurační soubory pro gradle a idea, nevšímejte si jich. Dále se zde
nachází složky:
gradle/
, obsahující wrapper pro gradle.src/
, která je prázdná.
Žádnou z těchto složek nemažte ani needitujte. Složku src/
nebudeme používat. Ze souborů se zde nachází:
build.gradle
, konfigurační soubor obsahující informace o sestavení hlavního moduluchat
.- Soubor
settings.gradle
obsahující informaci o názvu projektu. - Soubory
gradlew
agradlew.bat
, které jsou spouštěcími soubory pro gradle.
S touto strukturou se ale nespokojíme, protože chceme tvořit klient-server
aplikaci. Vytvoříme si tedy moduly reprezentující klienta, server a
sdílenou část. Klikneme pravým tlačítkem na kořenovou složku
(chat/
) a vybereme New -> Module. Zobrazí se nám stejné okno
jako při zakládání nového projektu. Opět vybereme, že chceme, aby se o
závislosti staral Gradle. Dále vybereme, že chceme jazyk Java a pokračujeme
tlačítkem Next.
V dalším okně se nachází nastavení GroupId a ArtifactId. GroupId je
již předvyplněno a nebudeme ho měnit. Do ArtifactId napíšeme název
nového modulu. Nejdříve založíme modul pro klienta, takže do políčka
vyplníme client
a pokračujeme tlačítkem Next.

V posledním okně se zobrazí nastavení umístění modulu. Vše necháme
ve výchozích hodnotách a tlačítkem Finish dokončíme vytvoření prvního
modulu. Stejně postupujte i pro modul server
a
share
.
Výsledná struktura projektu je k dispozici na následujícím obrázku.

Každý modul disponuje složkou src/main/java/
, do které
budeme psát zdrojový kód. Složka resources/
slouží pro
případné doplňující soubory jako jsou obrázky, překlady apod. Složka
test/
obsahuje stejné složky jako main/
, ale je
určena k testování aplikace.
Nastavení závislostí
Nyní si nastavíme závislosti mezi moduly. Modul share
bude
obsahovat třídy, které budou společné jak pro klienta, tak pro server.
V modulu client
otevřeme soubor build.gradle
a
doplníme závislost na modulu share
příkazem
compile project(':share')
do místa nastavení závislostí
dependencies
. Ten samý příkaz vložíme i do modulu
server
.
Jednotlivé moduly lze zkompilovat příkazem:
client: gradlew :client:compileJava server: gradlew :server:compileJava share: gradlew :share:compileJava
Příkazy se spouští v příkazové řádce. V IntelliJ existuje plugin terminal, který zpřístupní příkazovou řádku přímo v prostředí. Pokud máte plugin aktivní, můžete terminál zobrazit kliknutím na záložku terminal ve spodní části IDE. V opačném případě je potřeba plugin povolit v nastavení pluginů: File -> Settings -> Plugins. V okně zadáte do vyhledávacího pole název pluginu terminal a zaškrtnete checkbox. Po potvrzení změn a restartu IDE bude terminál aktivní a připravený k použití.
Nyní, pokud spustíte kompilaci klienta, tak se nejdříve zkompiluje modul
share
a až pak modul client
.
Ještě chvilku zůstaneme u modulu client
a souboru
build.gradle
. Abychom mohli klienta snadno spouštět, je potřeba
přidat plugin, který se o to postará. Na začátku souboru do definice
pluginů přidejte plugin application:
plugins { id 'java' id 'application' }
Tento plugin ještě potřebuje zadefinovat název hlavní třídy a to se
všemi balíčky, ve kterých se třída nachází. Vytvoříme proto novou
proměnnou, která nebude v žádném bloku a nazveme ji
mainClassName
:
mainClassName = 'cz.stechy.chat.SimpleClient'
Přesuneme se do modulu server
, opět do souboru
build.gradle
. Server budeme v budoucnu spouštět s parametry.
Abychom tyto parametry snadno předali JVM, je potřeba vytvořit vlastní
task:
task run (type: JavaExec, dependsOn: classes){ if(project.hasProperty('arg')){ args(arg.split(',')) } main = "cz.stechy.chat.Server" classpath = sourceSets.main.runtimeClasspath jvmArgs = [ "-Dkey=value" ] standardInput = System.in }
Spouštění klienta a serveru bude následující:
client: gradlew :client:run server: gradlew :server:run -Parg=-port=21298
To by bylo z úvodní lekce vše.
Příště, v lekci Java server - Parametry serveru, začneme tvořit serverovou část chatu.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 53x (110.59 kB)
Aplikace je včetně zdrojových kódů v jazyce Java