POO Lab Lucrarea 5
De la WikiLabs
Noțiuni și cunoștințe necesare
- Paradigma Obiect-Orientare; Clase și obiecte
- Noțiuni despre Java
- Realizarea și execuția unui program Java
- Sintaxa limbajului Java; Structura lexicală a unui program
- Convenții de programare
- Noțiuni avansate de programare obiect-orientată
- Java Application Programming Interface (API)
- Stream-uri de Input/Output
- Tratarea excepțiilor
- Serializarea obiectelor
- Socket-uri de rețea
- Programare concurentă - fire de execuție (Threads)
Cerințe
- Scrieţi o clasă ServerPeer, de tip fir de execuţie, care să administreze o conexiune cu un client. Aceast thread trebuie:
- să poată deserializa obiectele de tip Message trimise de către clientul asociat și să le trimită către Server;
- să conțină o metodă care să poată trimite obiecte de tip Message către client (dacă numele clientului este identic cu câmpul receiver din mesaj, sau acesta este null);
- să stocheze numele clientului.
- Numele clientului se modifică doar când se primește de la client un obiect de tip SystemMessage unde câmpul type are valoarea TYPE_CHANGE_NAME. Dacă numele nu este deja utilizat de alt client, se face modificarea și se răspunde clientului cu un obiect de de tip SystemMessage unde câmpul type are valoarea TYPE_OK, altfel, se răspunde cu un obiect de tip SystemMessage unde câmpul type are valoarea TYPE_ERROR.
- Modificați clasa Server astfel încât:
- să conțină referințe la obiecte de tip ServerPeer, câte un obiect pentru fiecare client conectat;
- să creeze câte un obiect nou de tip ServerPeer pentru fiecare client nou conectat și să le pornească pe fiecare ca fir execuție;
- să centralizeze toate obiectele de tip Message de la toți ServerPeer, și să le paseze mai departe la aceștia;
- să elimine automat din lista de clienți pe cei care s-au deconectat;
Hint: Folosiți-vă de clasa java.util.ArrayList.
- Modificați clasa Client astfel încât, pe lângă funcționalitatea anterioară, să deserializeze în continuu obiecte de tip Message de pe stream și să le afișeze în consolă. În plus, la fiecare conectare, se trimite server-ului un obiect de tip SystemMessage unde câmpul sender trebuie să conțină numele clientului. Dacă răspunsul este TYPE_ERROR, programul se încheie.