POO Lab Lucrarea 5: Diferență între versiuni

De la WikiLabs
(Cerințe)
(Cerințe)
Linia 18: Linia 18:
 
# Modificați clasa <code style="color: green">seriaf.poo.client.ClientPeer</code> 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 <code style="color: green">seriaf.poo.structs.Message</code> dinspre server și să le afișeze pe ecran. Acest thread, odată instanțiat, trebuie pornit de către clasa <code style="color: green">seriaf.poo.client.TextClient</code>.
 
# Modificați clasa <code style="color: green">seriaf.poo.client.ClientPeer</code> 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 <code style="color: green">seriaf.poo.structs.Message</code> dinspre server și să le afișeze pe ecran. Acest thread, odată instanțiat, trebuie pornit de către clasa <code style="color: green">seriaf.poo.client.TextClient</code>.
 
# Modificați clasa <code style="color: green">seriaf.poo.server.ServerPeer</code> 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 <code style="color: green">seriaf.poo.structs.Message</code> și <code style="color: green">seriaf.poo.structs.PrivateMessage</code> de la clientul asociat și să le distribuie corect la ceilalți clienți.
 
# Modificați clasa <code style="color: green">seriaf.poo.server.ServerPeer</code> 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 <code style="color: green">seriaf.poo.structs.Message</code> și <code style="color: green">seriaf.poo.structs.PrivateMessage</code> de la clientul asociat și să le distribuie corect la ceilalți clienți.
 +
# Pentru a putea retransmite mesajele celorlalți clienți, clasa <code style="color: green">seriaf.poo.server.ServerPeer</code> trebuie să aibă o metodă publică <code style="color: green">void sendMessage(Message)</code> care să serializeze obiectul primit ca argument către clientul conectat.
 +
# Adăugați clasei <code style="color: green">seriaf.poo.structs.Message</code> o metodă getter publică pentru expeditor, numită <code style="color: green">String getSender()</code>.
 +
# Pentru a putea trimite corect mesajele private, clasa <code style="color: green">seriaf.poo.server.ServerPeer</code> trebuie să aibă o metodă publică numită <code style="color: green">String getUsername()</code> care să întoarcă numele client-ului conectat la acel ServerPeer. Numele este stocat în clasă într-un câmp privat, care se actualizează la fiecare mesaj primit, extrăgând din mesaj numele expeditorului.
 
# Modificați clasa <code style="color: green">seriaf.poo.server.Server</code> scrisă la tema anterioară, astfel încât la conectarea unui client, aceasta să creeze un nou <code style="color: green">seriaf.poo.client.ServerPeer</code> pe care să-l pornească ca Thread, apoi să revină în metoda <code style="color: green">ServerSocket.accept()</code>, așteptând o nouă conexiune.
 
# Modificați clasa <code style="color: green">seriaf.poo.server.Server</code> scrisă la tema anterioară, astfel încât la conectarea unui client, aceasta să creeze un nou <code style="color: green">seriaf.poo.client.ServerPeer</code> pe care să-l pornească ca Thread, apoi să revină în metoda <code style="color: green">ServerSocket.accept()</code>, așteptând o nouă conexiune.
* Server-ul nu trebuie să accepte o conexiune dacă numărul de clienți conectați este deja egal cu proprietatea MAX_CLIENTS citită din fișierul ''server.conf'' de către <code style="color: green">seriaf.poo.server.config.ServerConfig</code>.
+
# Server-ul nu trebuie să accepte o conexiune dacă numărul de clienți conectați este deja egal cu proprietatea MAX_CLIENTS citită din fișierul ''server.conf'' de către <code style="color: green">seriaf.poo.server.config.ServerConfig</code>.
  
 
Note:
 
Note:

Versiunea de la data 26 noiembrie 2015 13:08

Noțiuni și cunoștințe necesare

Cerințe

  1. Modificați clasa seriaf.poo.client.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 seriaf.poo.structs.Message dinspre server și să le afișeze pe ecran. Acest thread, odată instanțiat, trebuie pornit de către clasa seriaf.poo.client.TextClient.
  2. Modificați clasa seriaf.poo.server.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 seriaf.poo.structs.Message și seriaf.poo.structs.PrivateMessage de la clientul asociat și să le distribuie corect la ceilalți clienți.
  3. Pentru a putea retransmite mesajele celorlalți clienți, clasa seriaf.poo.server.ServerPeer trebuie să aibă o metodă publică void sendMessage(Message) care să serializeze obiectul primit ca argument către clientul conectat.
  4. Adăugați clasei seriaf.poo.structs.Message o metodă getter publică pentru expeditor, numită String getSender().
  5. Pentru a putea trimite corect mesajele private, clasa seriaf.poo.server.ServerPeer trebuie să aibă o metodă publică numită String getUsername() care să întoarcă numele client-ului conectat la acel ServerPeer. Numele este stocat în clasă într-un câmp privat, care se actualizează la fiecare mesaj primit, extrăgând din mesaj numele expeditorului.
  6. Modificați clasa seriaf.poo.server.Server scrisă la tema anterioară, astfel încât la conectarea unui client, aceasta să creeze un nou seriaf.poo.client.ServerPeer pe care să-l pornească ca Thread, apoi să revină în metoda ServerSocket.accept(), așteptând o nouă conexiune.
  7. Server-ul nu trebuie să accepte o conexiune dacă numărul de clienți conectați este deja egal cu proprietatea MAX_CLIENTS citită din fișierul server.conf de către seriaf.poo.server.config.ServerConfig.

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.
  • Pentru a verifica dacă un obiect e instanță a unei clase anume, puteți folosi operatorul instanceof:
Object o = ois.readOject();
if(o instanceof String){
    String s = (String)o;
    System.out.print(s);
}else{
    System.out.print("The object is not a String!");
}