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
- 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 tipseriaf.poo.structs.Message
dinspre server și să le afișeze pe ecran. Acest thread, odată instanțiat, trebuie pornit de către clasaseriaf.poo.client.TextClient
. - 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 tipseriaf.poo.structs.Message
șiseriaf.poo.structs.PrivateMessage
de la clientul asociat și să le distribuie corect la ceilalți clienți. - Modificați clasa
seriaf.poo.server.Server
scrisă la tema anterioară, astfel încât la conectarea unui client, aceasta să creeze un nouseriaf.poo.client.ServerPeer
pe care să-l pornească ca Thread, apoi să revină în metodaServerSocket.accept()
, 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
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!");
}