Programarea Aplicatiilor de Tip Client-Server in Limbajul Java
Programarea Aplicatiilor de Tip Client-Server in Limbajul Java
LUCRARE DE LICEN
Conductor tiinific:
Conf. dr. Baranga Andrei
Absolvent:
Pietruel Andrei
Bucureti
Iunie 2013
Conductor tiinific:
Conf. dr. Baranga Andrei
Absolvent:
Pietruel Andrei
Bucureti
Iunie 2013
Cuprins
1. Limbajul Java
1.1. Introducere
1.2. Istoric
1.3. Caracteristici
1.3.1. Orientarea pe obiecte
1.3.2. Independena de platform
1.3.3. Colectarea reziduurilor de memorie
1.4. Interfee grafice cu Swing
4
4
4
5
5
6
8
9
13
13
15
16
22
22
23
23
24
32
36
36
36
37
42
4. Concluzii
52
5. Bibliografie
53
18
47
Limbajul Java
1. Limbajul Java
1.1. Introducere
Java este un limbaj de programare orientat pe obiect al crui design a avut n
minte ca oricare dependene hardware n implementarea programelor s fie minime.
Principiul pe care se bazeaz este acela de a scrie cod o singur dat iar acesta s
poat rula dup compilare pe o multitudine de dispozitive. Aplicaiile Java sunt de
regul compilate n cod de maina virtual (bytecode) i anume fiiere .class care pot
rula pe orice maina virtual Java (JVM), indiferent de arhitectura computerului n
cauz.
Java este, n prezent, unul dintre cele mai populare limbaje de programare, folosit n
special pentru aplicaii web client-server, estimnd numrul de programatori care l
folosesc la 11 milioane.
Java a fost creat de la James Gosling la compania Sun Microsystems (care mai
trziu a devenit parte a Oracle Corporation). Limbajul a fost scos pe pia de Sun
Microsystems n 1995 ca parte component principal a platformei Java. Limbajul i
deriva n mod semnificativ sintaxa din C i C++, dar are mai puine faciliti low-level
dect oricare dintre ele.
1.2. Istoric
nceputurile limbajului Java se regsesc ntr-un proiect al lui James Gosling
numit Oak n Iunie 1991. Ceea ce Gosling voia s creeze era o main virtual i un
limbaj de programare care s aib sintax asemntoare C-ului dar cu o mai mare
simplitate i uniformitate dect C/C++. Prima implementare public a proiectului a
fost Java 1.0 n 1995. Promisiunea fcut de Sun Microsystems n ceea ce privete
noul produs al lor a fost rezumat la urmtorul slogan: Write Once, Run Anywhere,
referindu-se la faptul c un program scris n Java poate rula pe orice sistem de calcul
popular. Creaia lui Gosling se dovedise performant din punct de vedere a securitii
informaionale, iar n aceast privin maina virtual Java oferea opiunea de acces
limitat la reea i fiiere. Nu dupa mult timp de la momentul punerii pe pia a Java
1.0, browserele Web populare la vremea respectiv au incorporat maina virtual
Java n configuraiile lor, dnd natere Applet-urilor. Noi versiuni pentru platforme
4
Limbajul Java
mari i mici (J2EE i J2ME) au fost curnd create cu prilejul scoaterii pe pia a Java 2.
n 1997, Sun a adoptat standardele ISO/IEC JTC1 iar apoi cele ale Ecma
International pentru a formaliza Java, dar mai trziu s-a abtut de la proces. Sun face
ca majoritatea implementrilor platformei Java s fie disponibile publicului larg n
mod gratuit, majoritatea profitului firmei fiind obinut din produse specializate
precum Java Enterprise System. Sun deosebete dou categorii distincte de
implementri a platformei Java: Development Kit (JDK), care permite creerea de
aplicaii folosind limbajul Java, i Runtime Environment (JRE) care este necesar rulrii
aplicaiilor Java dar nu permite dezvoltarea acestora, compilatorul nefiind inclus.
1.3. Caracteristici
In crearea limbajului Java au existat cinci principii:
1. Trebuie s foloseasc metodologia programrii orientat pe obiecte
2. Trebuie s permit rularea pe mai multe sisteme de operare a unui program
creat folosind limbajul
3. Trebuie s conin suport integrat pentru folosirea reelelor de calculatoare
4. Trebuie s fie conceput astfel nct executarea de cod de la surse externe s
fie sigur
5. Trebuie s fie uor de folosit, selectnd ceea ce era considerat bun de la alte
limbaje orientate pe obiect
Relativ la principiile pe care s-a bazat crearea limbajului Java, voi expune n cele
ce urmeaz principalele caracteristici ce l definesc.
Limbajul Java
pe acele date sau invers. Separarea in obiecte coerente ofer o fundaie mai stabil
pentru design-ul unui sistem software. Scopul este acela de a face marile proiecte
software mai usor de ntreinut, mbuntind astfel calitatea i reducnd numrul de
proiecte euate.
Un alt principiu central al programrii orientate pe obiecte este acela de a
dezvolta obiecte mai generice, astfel nct codul s poate fi refolosit n multiple
proiecte. Un obiect generic, ca de exemplu client ar trebui s aib aproximativ
acelai set de comportamente (aciuni) n proiecte diferite, n special dac aceste
proiecte au n comun un nivel fundamental al logicii de programare cum se ntmpl
de obicei n companiile mari. n acest sens, obiectele pot fi vzute precum
componente refolosibile, ajutnd industria software s creeze proiecte n mare
msur din piese existente care sunt extensiv testate, n acest mod reducnd masiv
timpul necesar n dezvoltarea acestora. Reutilizabilitatea soft-urilor a avut rezultate
mprite, dar preponderent pozitive. Principalele dificulti ale acestei abordri n
proiectarea aplicaiilor sunt design-ul unor obiecte cu adevrat generice i lipsa unei
metodologii de comunicare masiv ntre dezvoltatorii de software care s ofere
oportuniti de cod reutilizabil.
Limbajul Java
o parte, prin compilarea nainte de execuie a bytecode-ului n cod main, lucru care
ar face totui ca faza de ncrcare a programului s dureze mai mult. O alt metod
mai eficient este stocarea n memorie ca bytecode a programului i compilarea
preliminar a segmentul de cod care trebuie rulat curent, mbuntind astfel viteza
de rulare. Compilatorul JIT inclus n maina virtual Java folosete o metod hibrid
ntre cele amintite, translatarea ntmplndu-se n mod continuu, asemeni
interpretoarelor, dar innd totui un cache al codului translatat pentru a minimiza
degradarea performanei. Pe de alt parte, aceasta soluie de optimizare ofer i alte
avantaje precum suportul pentru date late-bound i abilitatea de a garanta
integritatea i securitatea programului. Compilarea JIT a fost creat dup dou idei
existente deja i anume compilarea bytecode-ului i compilarea dinamic.
Rezumnd, principiul compilrii JIT pentru Java este conversia la rulare a bytecodeului corespunztor mainii virtuale Java n machine code corespunztor sistemului
hardware gazd.
Exist totui implementri de compilatoare Java care compileaz n cod obiect
nativ, cum ar fi GCJ, scpnd de pasul intermediar al bytecode-ului, dar produsul final
al acestor compilatoare poate fi rulat doar pe o singur arhitectur.
Licena lui Sun pentru Java insista ca toate implementrile ale mainii virtuale
trebuie s fie compatibile. Acest lucru a cauzat o disput n instan cu Microsoft,
atunci cnd Sun a aclamat c implementarea fcut de Microsoft nu suport
interfeele RMI i JNI i adaug faciliti dependente de o platform (Windows). Ca
rspuns la aceast acuzare, Microsoft nu a mai distribuit Java ca parte component a
sistemelor de operare Windows, iar urmatoarele versiuni ale Internet Explorer nu
mai suportau applet-uri Java fr un plugin third-party. Totui, Sun i alte companii
au fcut disponibile implementri gratuite ale runtime-ului Java (JRE) pentru acestea
i pentru noile versiuni de Windows.
Primele implementri ale limbajului foloseau o main virtual interpretat
pentru a obine portabilitatea. Acestea produceau programe care rulau mai ncet
dect programele compilate n executabile native scrise n C sau C++. Din acest
motiv, limbajului Java i s-a atribuit o reputaie proast din punct de vedere al
performanei. Cele mai recente implementri ale JVM, n schimb, produc programe
care ruleaz n mod semnificativ mai repede dect nainte, folosind diverse tehnici.
Prima tehnic este s compileze direct n cod nativ ca un compilator tradiional,
srind peste transformarea n bytecode n ntregime. Acest lucru asigur
performan superioar dar vine cu preul portabiliii. O alt tehnic este
compilarea JIT explicat anterior. Alternativa la cele doua tehnici, folosit pentru
7
Limbajul Java
creterea vitezei de execuie este recompilarea dinamic. Aceasta presupune ca
maina virtual s analizeze comportamentul unui program rulat i s recompileze i
optimizeze selectiv pri critice ale acestuia. Recompilarea dinamic poate oferi
optimizri mai mari chiar dect compilarea static (tradiional) specific limbajelor
native, deoarece compilatorul dinamic i poate baza optimizrile pe anumite
informaii accesibile doar n timpul rulrii programului cum ar fi mediul sau clasele
ncrcate. mpreun, compilarea Just-in-time i recompilarea dinamic ofer
programelor Java avantajul vitezelor foarte apropiate de cele ale codului nativ, fr a
pierde portabilitatea.
Portabilitatea este o dificultate tehnic major iar succesul lui Java n aceast
arie a avut urcuri i coboruri de-a lungul timpului. Chiar dac a scrie programe pe
platforma Java care s ruleze n mod consistent pe multiple platforme gazd este
ntr-adevr posibil, exist totui un numr mare de sisteme pe care programele Java
ruleaz cu minimale erori i inconsistene.
Aplicaiile Java independente de platform, totui, cum ar fi cele server-side ca
serviciile Web, servleii, Enterprise JavaBeans i sistemele nglobate bazate pe OSGi
ce folosesc Java se bucur de un succes considerabil.
Limbajul Java
referine la un anumit obiect, colectorul de reziduuri Java l terge n mod automat,
golind memoria i prevenind, astfel, o scurgere. Scurgeri de memorie pot nc
aprea, totui, dac programatorul ine referine la obiecte care nu mai sunt
necesare, ntr-un cuvnt scurgerile pot nc aprea dar la un nivel conceptual mai
nalt.
Folosirea colectrii rezuduurilor de memorie poate afecta i anumite
paradigme de programare. De exemplu, dac programatorul estimeaz costul
alocrii/recolectrii memoriei ca fiind mic, ar putea s aleag s construiasc obiecte
ntr-un mod mai liber n loc s le preiniializeze, innd referine la ele i refolosindule. Avnd n vedere micul cost al uoarei scderi a performanei (de exemplu anumite
structuri repetitive folosite n creerea unor obiecte mari, complexe), aceasta metod
faciliteaz izolarea thread-urilor (nu mai este nevoie de a sincroniza multiple threaduri, fiecare dintre acestea lucrnd pe instane de obiecte diferite).
Fcnd o comparaie ntre Java i C++ n ceea ce privete managementul
automat al memoriei, este posibil n C++ a implementa o funcionalitate similar cu
ceea ce ofer Java dar acest lucru necesit timp i complexitate suplimentar n
aplicaie. De exemplu, un model pentru dealocarea automat a memoriei poate fi
scris pentru anumite clase n C++ pentru a mbunti viteza i a limita fragmentarea
memoriei n mod considerabil. n Java, colectarea reziduurilor este integrat i virtual
invizibil programatorului. Din aceast cauz, dezvoltatorii de software nu cunosc
momentul exact al dealocrii automate a memoriei, acesta nefiind corelat cu aciuni
explicit scrise n cod. n funcie de aplicaia care se dorete a fi creat, acest lucru
poate fi ori benefic, ori un dezavantaj: programatorul este eliberat de povara
cerinelor low-level dar n acelai timp pierde opiunea de a scrie cod de nivel sczut.
Limbajul Java
afar de componente ades ntlnite precum butoane, csue bifabile i etichete,
Swing mai ofer i elemente de interfa mai avansate precum panouri cu taburi,
tabele, liste derulabile, etc. O alt diferen major ntre Swing i AWT este faptul c
Swing este n intregime scris n Java, prin urmare toate componentele sale sunt
independente de platform, termenul lightweight fiind folosit pentru a le descrie
aceasta calitate.
Dac dorim s facem un scurt istoric al Swing, putem considera ca punct de
origine Internet Foundation Classes (IFC), o librrie grafic pentru Java dezvoltat
original de Netscape Communication Corporation i fcut public pentru prima oar
pe 16 decembrie 1996. Pe 2 aprilie 1997, Sun Microsystems i Netscape
Communications Corporation au anuntat intenia lor de a ncorpora IFC cu alte
tehnologii din Java Foundation Classes. Java Foundation Classes au fost mai tarziu
redenumite Swing.
Swing a introdus un mecanism care permitea afirii grafice i funcionalitii
fiecrei componente de interfa s fie alterate fr a face schimbri substaniale n
logica aplicaiei. Unul din punctele cheie care a stat la baza dezvoltrii Swing a fost
caracterul de plugin al acestuia, permind rapida fuzionare a codului logicii aplicaiei
cu cel al interfeei grafice. Printre avantajele noi aduse de Swing se numar desigur i
portabilitatea amintit anterior, componentele de interfa putnd acum s emuleze
stilul grafic specific interfeei native a sistemului, neabandonnd ns avantajele
independenei de platform. Swing a fost introdus ca parte a Java Standard Edition
ncepnd cu versiunea 1.2.
Clasele i componentele Swing sunt coninute n pachetele din ierarhia
javax.swing. Toate componentele deriv din clasa javax.swing.Jcomponent. Obiectele
Swing arunc evenimentele (events) n mod asincron, au proprieti i rspund la un
set documentat de metode specifice fiecrei componente. Toate componentele
Swing sunt Java Beans n conformitate cu specificaiile arhitecturii Java Beans
Component ce promoveaz codul reutilizabil.
Lund n considerare modelul de randare al interfeei Swing, controlul fin
asupra randrii unei componente este posibil. Reprezentarea vizual a unei
componente Swing este o compunere de elemente dintr-un set standard ce conine
rame, identri, decoraii i alte proprieti. n mod tipic, programatorii vor modifica
din cod o astfel de component, definind rame, culori, fundale i opaciti n funcie
de stilul vizual preferat. Componenta apoi va folosi aceste proprieti la randare.
Totui, este posibil a crea controale GUI cu o reprezentare vizual foarte
personalizat.
10
Limbajul Java
Swing se bazeaz pregnant pe mecanisme disponibile n timpul execuiei
programului (runtime) i astfel permite rspunderea i adaptarea rapid la schimbri
fundamentale de setri n timpul rulrii. De exemplu, o aplicaie bazat pe Swing are
capacitatea de a-i schimba instant interfaa grafic fr a interfera cu logica
aplicaiei. Acest lucru este util n cazul programelor care ofer interfee alternative
utilizatorilor, numite de obicei skins sau n cazul programelor ce necesit trecerea
de la un meniu la altul n cadrul aceleiai ferestre.
Nivelul de flexibilitate al Swing este reflectat de abilitatea sa inerent de a
trece peste conveniile controalelor grafice ale sistemului de operare nativ pentru a
se afia. Swing i randeaz controalele cu ajutorul unor API-uri Java 2D, n loc s
apeleze setul de instrumente pentru interfaa grafic a platformei native. Aadar, o
component Swing nu are un echivalent corespunztor sistemului de operare al
hardware-ului gazd i este liber s se afieze n orice mod permis de API-urile de
randare amintite. Totui, la baz, fiecare component Swing are un container AWT
deoarece Jcomponent al lui Swing extinde Container al lui AWT. Acest lucru permite
Swing s se foloseasc de elemente cruciale ale sistemului de operare nativ i anume
interaciunile cu utilizatorul (apsri de taste sau micri ale mouse-ului. Swing doar
i transpune semantica independent de platform peste componentele native ale
sistemului gazd. De exemplu, fiecare component Swing este randat de
dispozitivul grafic (placa video) ca rspuns al apelului metodei component.paint(),
care e definit n (AWT) Container. Dar spre deosebire de componentele AWT, care
delegau afiarea lor sistemului de operare gazd, componentele Swing sunt
responsabile de propria lor randare. Aceast decuplare nu este doar vizual ci este
extins la managementul unei semantici de aplicaie independent de sistemul de
operare n cadrul ierarhiei de componente din pachetele din javax.swing.
Librria Swing se folosete mult de modelul de design sofware Model-ViewController (MVC) care n mod conceptual decupleaz datele vizualizate de interfaa
grafic n care sunt afiate. De aceea, cele mai multe dintre componentele Swing au
asociate modele (care sunt specificate n cod Java prin interfee), iar programatorii
pot folosi pentru acestea o multitudine de implementri implicite sau pot furniza
unele create de ei. Framework-ul Swing ofer implementri implicite de modele de
interfa pentru toate componentele sale concrete. Folosirea tipic a Swing nu
necesit crearea de modele personalizate deoarece framework-ul ofer un set de
implementri implicite care sunt n mod transparent asociate cu clasa derivat din
JComponent corespunztoare componentei n cauz. n general, doar componentele
complexe precum tabelele, arborii sau uneori listele au nevoie de modele
personalizate care s corespund cu structurile de date specifice aplicaiei.
11
Limbajul Java
n mod tipic, obiectele model ale componentelor Swing sunt responsabile cu
oferirea unei interfee concise care s defineasc event-urile aruncate i a unor
proprieti accesibile pentru modelul de date conceptual, pentru a putea fi folosite
de JComponent-ul asociat. innd cont c MVC este n principiu bazat pe relaii
discrete ntre obiecte ce se doresc a colabora, un obiect model ofer facilitile
necesare n programare pentru a ataa un event listener obiectului corespunztor
modelului de date. De obicei, aceste event-uri sunt centrate pe model (de exemplu
un event pentru inserarea unui rnd ntr-un model tabel) i sunt mapate de
specializarea JComponent ntr-un eveniment concret pentru componenta vizual
(GUI). De exemplu JTable are un model numit TableModel care descrie o interfa
pentru accesarea datelor dintr-un tabel. O implementare implicit pentru acest lucru
opereaz pe un tablou bidimensional.
Componenta vizualizare (view) a unei componente Swing este obiectul folosit
pentru a afia grafic controlul GUI conceptual. O distincie a Swing este, dup cum s-a
afirmat anterior, folosirea randrii din cod a controalelor (n comparaie cu AWT care
folosea controalele grafice ale sistemului de operare nativ). nainte de Java 6 Update
10, aceast deosebire era o surs de complicaii cnd se foloseau n aceai aplicaie
att controale Swing, ct i controale AWT.
n ceea ce privete compunerea elementelor vizuale i managementul
acestora, Swing ofer layout-uri relative, care se bazeaz pe relaiile dintre poziiile
componentelor n contrast cu layout-uri absolute care specific exact locaiile i
dimensiunile componentelor. Aceast tendin ctre ordonarea vizual fluid i
are originile n dezvoltarea mediului de operare al applet-urilor care a condus ulterior
la design-ul setului original de instrumente pentru interfee grafice Java GUI Toolkit.
O observaie interesant este i similaritatea acestui mod de organizarea a afirii
elementelor grafice n Java Swing cu cel folosit n randarea coninutului HTML n
browsere Web.
12
18
throws IOException
20
21
22
fiind clasicul punct de acces in cadrul unei aplicaii Java. Metoda instaniaz un nou
formular de tipul clasei ControlPanel din pachetul ApplicationServer.Frames. Prin
intermediul formularului instaniat se va putea apsa un buton de start pentru
pornirea efectiv a serverului.
Aplicaia compilat i gata de distribuie (care este sub forma unui pachet
executabil .jar format din fiiere .class corespunztoare claselor a cror surs sunt
.java-urile din pachetele explicitate) va avea, deci, ca punct de start clasa Main. Sub o
platform precum Windows deschiderea prin dublu click a fiierului .jar este acelai
lucru cu rularea din shell a comenzii:
Clasa Connection
Aceast clas definete o conexiune ntre server i un client. Fiecare client
conectat la server se va identifica printr-un obiect de tip Connection.
n continuare voi numi cmpurile din clasa Connection care definesc obiectul
conexiune:
24
Socket clientSocket
VoiceConnection voiceConnection
String name
ObjectOutputStream oos
ObjectInputStream ois
25
:$destinatar$mesaj
:$expeditor$mesaj
nume$mesaj
26
receiveDisconnect()
Connection(Socket socket)
27
28
Dup cum tim avnd acces la obiectul conexiune al unui client putem aplica
orice operaie suportat de transmitere de date nte acesta i restul clienilor
prin intermediul metodelor din clasa Connection.
este un cmp care ine minte numrul de conexiuni curente la server. Acesta
va fi, evident incrementat n momentul n care un nou client este acceptat de
ctre server.
29
care returneaz direct obiectul Connection pentru clientul a crui nume e dat
ca parametru din tabelul asociativ matchCon unde sunt stocate toate
conexiunile;
30
listener.accept()
Clasa VoiceConnection
Ca i n cazul claselor prezentate anterior, voi ncepe prin expunerea
cmpurilor din clas:
este socketul de tip client care va fi creat odat cu stabilirea unei conexiuni
audio ntre server i clientului corespunztor obiectului conexiune audio
curent.
32
este principala metod de transmisie a datelor audio ntre doi clieni conectai
la server. Obiectul curent este considerat cel care trasmite, iar fluxul primit ca
parametru este cel al obiectului spre care se dorete transmiterea datelor
audio.
n cadrul metodei, se creeaz un nou thread, n care printr-un ciclu while se
transmite, buffer cu buffer, informaia primit de la clientul asociat obiectului
conexiune curent, ctre clientul al crui flux e primit ca parametru. Notm
faptul c, referina thread-ului creat este atribuit cmpului transmission al
obiectului curent.
Aceast metod este nucleul ntregii comunicri de date audio ntre clienii
conectai la server. Se observ faptul c inafara necesitii folosirii unui buffer
pentru transmiterea gradual a datelor, modul de transmitere este unul
obinuit ca i n cazul irurilor de caractere.
34
VoiceConnection callee =
(Server.getConnection(calleeName).voiceConnection = new
VoiceConnection(calleeName, callerName));
transmitTo(Server.getConnection(calleeName).voiceConnection.ou
t);
callee.transmitTo(this.out);
Rezumnd, legtura audio dintre doi clieni conectai la server s-a realizat prin
construcia a dou obiecte VoiceConnection cu interdepentene puternice, care i
transmit, prin thread-uri separate, n mod continuu date i le trimit ctre
dispozitivele audio de redare ale sistemelor vizate.
35
Clasa ControlPanel
Aceast clas implementeaz minimalista interfa grafic cu butoanele de
pornire i oprire a serverului. Totodat n cadrul interfeei afiate prin instanierea
formularului Swing definit n clas se poate seta numrul maxim de conexiuni pe care
le poate permite serverul la un moment dat.
ntruct propun detalierea controalelor Swing n special pentru aplicaia client,
voi omite o descriere amnunit a logicii din spatele acestei interfee grafice.
Clasa Connection
Asemeni clasei Connection de pe server, aceast clas va implementa
totalitatea metodelor de transmitere a mesajelor prin socket-uri, va gestiona
fluxurile de intrare i de ieire asociate socket-urilor i va oferi mijloacele necesare
realizrii unei conexiuni audio cu un alt client.
Este important s precizez faptul c interfaa Runnable este implementat de
clasa Connection, fapt ce o nzestreaz cu posibilitatea rulrii logicii necesare pentru
interpretarea mesajelor primite de la server ntr-un thread separat.
Cmpurile clasei Connection sunt:
Socket socket
Socket voiceSocket
ObjectInputStream ois
ObjectOutputStream oos
este un flux de ieire care va fi iniializat cu cel asociat socket-ului socket dup
conectarea la server.
37
38
este o metod ce returneaz true dac socket-ul pentru mesaje text este nca
n conexiune cu serverul, sau false n caz contrar. Pentru aflarea acestei
informai se folosete rezultatul boolean returnat de apelarea metodei
socket.isBound().
39
:$expeditor$mesaj
atunci cnd este vorba despre primirea unui mesaj privat, caz n care se
apeleaz metoda userReceive() explicat anterior;
:%apelant
pentru ntiinarea aplicaiei de un apel voce cerut de un alt client, caz n care
se va apela metoda voiceReceive() explicat anterior;
40
Clasa Client
Clasa Client ofer versiuni de o abstractizare mai mare ale metodelor de realizare a
unei conexiuni, de trimitere a unui mesaj global i de trimiterea a unui mesaj privat.
Aceasta are dou cmpuri:
Connection connection
Thread receiveThread
41
Clasa DeviceGetter
Aceast clas se ocup cu setarea unui dispozitiv audio de intrare (input), de
obicei un microfon, care va fi folosit ca surs a datelor audio ale clientului n cadrul
unui apel vocal.
Avem doar un singur cmp:
Clasa Receiver
Clasa Receiver este cea care se ocup de nteaga transmitere, procesare i
redare a informaiei audio n cadrul unui apel vocal.
ntruct un singur apel vocal poate exista la un moment dat ntr-o aplicaie
client, am ales design pattern-ul Singleton pentru inplementarea clasei. O clas
singleton presupune existena unei singure instane a acesteia. Pentru acest lucru, se
definete un cmp de tipul clasei respective n interiorul acesteia care va memora
referina la unica instan a clasei. n plus, constructorul clasei devine privat iar o
metod care s furnizeze unica instan a clasei se definete.
n cazul clasei receiver pattern-ul singleton este dat de urmtorul bloc de cod:
43
ByteArrayOutputStream byteArrayOutputStream
AudioFormat audioFormat;
TargetDataLine sendDataLine
SourceDataLine receiveDataLine;
InputStream vis
OutputStream vos
Linia este apoi deschis i pornit prin apelarea metodelor open i start ale
obiectului sendDataLine.
Se creeaz apoi un fir de execuie nou de tipul CaptureThread, a crui clas
este imbricat n clasa curent (va fi descris ulterior). Acest thread va fi folosit
pentru continua citire a datelor de la dispozitivul surs i trimiterea acestora
ctre server. Threadul este imediat startat.
n mod similar ca i pentru linia audio surs a transmisiei se va proceda i
pentru linia de redare a datelor venite de la server, receiveDataLine. Pentru a
nu repeta raionamentul pe variabile, codul urmtor este relevant:
DataLine.Info dataLineInfo1 = new
DataLine.Info(SourceDataLine.class, audioFormat);
receiveDataLine = (SourceDataLine)
AudioSystem.getLine(dataLineInfo1);
receiveDataLine.open(audioFormat);
receiveDataLine.start();
45
n afara metodelor pe care le-am descris mai sus, dup cum am amintit pe
alocuri, clasa Receiver conine dou clase imbricate care extind Thread i
implementeaz mecanismele de primire i redare, respectiv nregistrare i
trimitere a datelor audio.
46
a sa este folosit pentru redarea unui sunet de apel n momentul n care se primete
sau se iniiaz un apel .
47
Dup cum se observ, formularul are 2 cmpuri, unul etichetat Alias, unde se
va introduce numele de utilizator dorit i unul setat Host unde se va introduce adresa
serverului. Prin apsarea butonului accept dup introducerea cmpurilor se va
ncerca conectarea la server (se apeleaz metodele corespunztoare din clasa Client).
Dup conectarea cu succes la server formularul acesta va disprea lsnd vizibil doar
pe cel specificat de clasa ClientFrame.
48
49
50
Dup cum se observ utilizatorul poate face click pe unul dintre cele dou
butoane puse la dispoziie. Apsarea butonului Answer va rspunde la apel iar
butonul etichetat Ignore va bara apelul.
51
4. Concluzii
Pornind de la noiunile teoretice i terminnd cu detalierea unei aplicaii
practice, am reuit s expunem ntreaga metodologie ce trebuie avut n vedere n
crearea aplicaiilor de tip client-server. Limbajul Java, dup cum am demonstrat prin
crearea aplicaiei de chat ofer suficiente faciliti pentru dezvoltarea unor programe
complexe care s foloseasc arhitectura client-server. i dac i alte limbaje de
programare pot realiza acest lucru, Java se remarc prin faptul c indiferent de
platforma desktop pe care ruleaz aplicaia creat, aceasta va rula fr probleme.
Acest lucru se datoreaz, dup cum am afirmat i n capitolul 1, folosirii unei maini
virtuale, care este independent de platform i care ruleaz aplicaia creat i
compilat sub form de bytecode. Fie sistemul de operare Windows, Linux sau Mac
OS, aplicaia va avea aceai comportare i acelai stil vizual.
Concluzionnd, Limbajul Java ofer suficiente faciliti pentru crearea de
aplicaii client-server, iar n acest sens, pe lng uurina folosirii acestuia fa de
altele care au un nivel de abstractizare mai mic (precum C/C++), limbajul se
dovedete ca fiind unul dintre cele mai puternice.
52
5. Bibliografie
Cri:
1. BHAVE, Mahesh P., PATEKAR, Sunil A., Programming with JAVA, Pearson
Education India, 2008
2. FREEMAN, Elisabeth, FREEMAN, Eric, BATES, Bert, SIERRA, Kathy, ROBSON,
Elisabeth, Head First Design Patterns, O'Reilly Media, Inc., 2004
3. HAROLD, Eliotte Rusty, Java Network Programming, 3rd Edition, Oreilly
Media, Inc., 2004
4. LINDLEY, Craig A., Digital Audio with Java, Prentice Hall PTR, 1999
5. TOPLEY, Kim, Core Swing: Advanced Programming, Pearson Education, 1999
Articole Web:
1. Free Java Guide, History of Java programming language,
http://www.freejavaguide.com/history.html, 16/04/2013
2. Wikipedia, The Free Encyclopedia, Java (programming language),
http://en.wikipedia.org/wiki/Java_(programming_language), 16/04/2013
3. Wikipedia, The Free Encyclopedia, Just-in-time compilation,
http://en.wikipedia.org/wiki/Just-in-time_compilation, 16/04/2013
4. Wikipedia, The Free Encyclopedia, Client-server model,
https://en.wikipedia.org/wiki/Client-server_model, 20/04/2013
53