Doporučení: Toto cvičení vyžaduje základní znalosti se streamy (datovými proudy), znalost problematiky serializace (ObjectOutputStream). Tuto problematiku si zopakujte.
TCP/IP
1. Vytvořte „Server“, který otevře serverový soket na portu „11111“ a očekává připojení klienta. Po připojení zapíše jeden byte(náhodnou hodnotu).
2. Vytvořte klienta, který se připojí a načte jeden byte od serveru.
3. Předchozí program modifikujte tak, že server klientovi zasílá instanci třídy MessageDTO (použijte serializaci).
4. Program modifikujte, že objekt třídy MessageDTO zasílá klient, server data upraví a pošle zpět.
Vlákna
5. Zajistěte, že server obsluhuje požadavky na separátním vlákně(použijte Thread).
6. Vyzkoušejte naivní implementaci typu Pool pro příklad producer-consumer – zobrazte si zatížení CPU v systému.
7. Zkuste vymazat klíčové slovo volatile u příznaku full ve třídě NaivePool a pozorujte změnu chování(použijte JDK8 nebo vyšší). Zkuste vysvětlit, co je příčinou této změny.
8. Naimplementujte typ Pool pomocí synchronized, wait and notifyAll. Pozorujte rozdíl v zatížení CPU.
Domácí úkol
VYTVOŘTE SI NOVÝ PROJEKT – RADĚJI NEPOUŽÍVEJTE TŘÍDY Z PROJEKTU, KTERÝ BYL NA CVIČENÍ.
Vytvořte „chatovací“ program pro dva uživatele. Program se spustí z příkazové řádky. Parametrem se zadá:
- zda se spustí v režimu server či klient,
- číslo portu,
- přezdívka,
- pokud je spuštěn v režimu klient, tak také adresa vzdáleného počítače, kde běží serverová část.
Program bude pracovat velice jednoduše – vše, co se načte z konzole od uživatele, se přepošle přes otevřené spojení vzdálené straně(bude se načítat po řádcích a připojí se přezdívka). Vše, co se načte ze stream-u dat putujících ze vzdálené strany, se vypíše na konzoli.
Program se ukončí, pokud vzdálená strana ukončí spojení (nastane END-OF-FILE ze stramu), nebo uživatel zapíše do konzole řetězec „KONEC RELACE“.