Diferență între revizuiri ale paginii „POO Lab Lucrarea 5”

De la WikiLabs
Jump to navigationJump to search
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ă clasă trebuie să poată deserializa obiectele de tip '''Message''' trimise de către clientul asociat și 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'''), și 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'''.  
+
* 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:
 
* 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ă 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''' și să le pornească pe fiecare ca fir execuție;
+
** 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 '''ClientPeer''', și să le paseze mai departe la aceștia;
 
** să centralizeze toate obiectele de tip '''Message''' de la toți '''ClientPeer''', și să le paseze mai departe la aceștia;
 
** să elimine automat din lista de clienți pe cei care s-au deconectat;
 
** 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.
 
* 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 28 august 2012 10:42

Noțiuni și cunoștințe necesare

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 ClientPeer, ș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.