POO Lab Lucrarea 5: Diferență între versiuni

De la WikiLabs
(Cerințe)
(Cerințe)
Linia 16: Linia 16:
 
== Cerințe ==
 
== Cerințe ==
  
* Scrieţi o clasă '''ServerPeer''', de tip fir de execuţie, care să administreze o conexiune cu un client. Aceast thread trebuie:
+
* Modificați clasa '''ClientPeer''' scrisă la tema anterioară, transformând-o într-un fir de execuție care în paralel cu firul principal de execuție, citească obiecte de tip '''Message''' dinspre server și să le afișeze pe ecran.
** poată deserializa obiectele de tip '''Message''' trimise de către clientul asociat și să le trimită către '''Server''';
+
* Modificați clasa '''ServerPeer''' scrisă la tema anterioară, transformând-o într-un fir de execuție. Acest fir nou de execuție trebuie citească obiectele de tip '''Message''' și '''PrivateMessage''' de la clientul asociat și le distribuie corect la ceilalți clienți.
** să conțină o metodă care poată trimite obiecte de tip '''Message''' către client (dacă numele clientului este identic cu câmpul '''receiver''' din mesaj, sau acesta este '''null''');
+
* Modificați clasa '''Server''' scrisă la tema anterioară, astfel încât la conectarea unui client, aceasta să creeze un nou '''ServerPeer''' pe care să-l pornească ca Thread, apoi să revină în metoda '''ServerSocket.'''.''accept()'', așteptând o nouă conexiune.  
** 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'''.  
+
Note:
* Modificați clasa '''Server''' astfel încât:
+
* Clasa '''Server''' ar trebui păstreze o listă cu toți clienții conectați (cu obiectele de tip '''ServerPeer'''). Pentru acest lucru puteți folosi de clasa [http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html java.util.ArrayList].
** să conțină referințe la obiecte de tip '''ServerPeer''', câte un obiect pentru fiecare client conectat;
+
* Această listă trebuie să fie menținută în sensul că noii clienți trebuie adăugați, iar clienții deconectați trebuie eliminați.
** creeze câte un obiect nou de tip '''ServerPeer''' pentru fiecare client nou conectat și să le pornească pe fiecare ca fir execuție;
+
* Această listă ar trebui fie accesibilă firelor de execuție de tip '''ServerPeer''' prin metode sincronizate.
** 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 [http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html 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.
 

Versiunea de la data 14 decembrie 2014 20:35

Noțiuni și cunoștințe necesare

Cerințe

  • Modificați clasa ClientPeer scrisă la tema anterioară, transformând-o într-un fir de execuție care în paralel cu firul principal de execuție, să citească obiecte de tip Message dinspre server și să le afișeze pe ecran.
  • Modificați clasa ServerPeer scrisă la tema anterioară, transformând-o într-un fir de execuție. Acest fir nou de execuție trebuie să citească obiectele de tip Message și PrivateMessage de la clientul asociat și să le distribuie corect la ceilalți clienți.
  • Modificați clasa Server scrisă la tema anterioară, astfel încât la conectarea unui client, aceasta să creeze un nou ServerPeer pe care să-l pornească ca Thread, apoi să revină în metoda ServerSocket..accept(), așteptând o nouă conexiune.

Note:

  • Clasa Server ar trebui să păstreze o listă cu toți clienții conectați (cu obiectele de tip ServerPeer). Pentru acest lucru vă puteți folosi de clasa java.util.ArrayList.
  • Această listă trebuie să fie menținută în sensul că noii clienți trebuie adăugați, iar clienții deconectați trebuie eliminați.
  • Această listă ar trebui să fie accesibilă firelor de execuție de tip ServerPeer prin metode sincronizate.