Sunteți pe pagina 1din 112

1 Introducere

Reelele de calculatoare s-au dezvoltat spectaculos n ultimii ani,


datorit evoluiei tehnologiilor hardware, software i de interconectare.
Tehnologii de mare vitez au dus la utilizarea reelelor de calculatoare n
toate domeniile vieii socio-economice, cu rezultate deosebite.

Clasificarea reelelor de calculatoare, dup criteriul distanei, n LAN


(Local Area Network), MAN (Metropplitan Area Nerwork) i WAN (Wide
Area Network) este foarte cunoscut astzi, iar Internet-ul este accesibil
aproape oricui.

Extinderea utilizrii Internet-ului a dus la dezvoltarea serviciilor i


aplicaiilor distribuite, prezentate pe scurt n acest material.

Serviciile Internet cele mai rspndite sunt: WWW, pota electronic


(e-mail), transferul fiierelor (ftp), conectarea la distan (telnet, ssh).

Unul dintre cele mai folosite servicii Internet este serviciul Web.

WWW (World Wide Web), cunoscut i sub denumitrea de Web sau


W3, reprezint serviciul Internet care permite navigarea pe colecii de
documente multimedia (hypertexte), din diferite reele, calculatoare prin
hyperlegturi, utiliznd o interfa comun (browser-ul).

Caracteristici:

Se deosebete de alte servicii Internet deoarece, prin concepia


sa, nglobeaz alte servicii ca: FTP, Gopher, Telnet, News.
Reprezint subnivelul superior al nivelului aplicaie.
Face apel la urmtoarele elemente:
o URL (Universal Resource Locators) identificatorul
uniform al resurselor;
o HTTP (HyperText Transfer Protocol);
o HTML (HyperText Markup Languages).

Serviciul Web se deosebete de alte servicii Internet prin faptul c


nglobeaz unele dintre ele, cum ar fi FTP, Gopher, Telnet, Wais, News.
Reele de calculatoare

1.1 Modelul client-server

Cel mai rspndit model de comunicare n Internet, avnd la baz


protocolul TCP/IP, este modelul client-server, model dup care
funcioneaz toate aplicaiile i serviciile Internet.

Clientul, de obicei, ruleaz pe calculatorul utilizatorului i este


folosit pentru a accesa informaii sau alte aplicaii din cadrul reelei.

Browser-ul:

emite cererile i recepioneaz datele care vor fi afiate;


formateaz documentele innd cont de tag-urile HTML;
afieaz documentele.

Exemple: Netscape, Internet Explorer, Lynx, HotJava, Mosaic.

Serverul ruleaz, de obicei, pe un calculator centralizator sau aflat la


distan, furniznd sau oferind informaii/servicii clienilor.

Exemple: Apache, NCSA, IIS (daemon httpd).

Client (cerere/rspuns) Server

Figura 1.1 Modelul client-server

Modelul client-server are la baz un protocol simplu, fr conexiune


de tipul ntrebare-rspuns.

La implementarea modelului client-server se ine seama de:


adresarea proceselor server;
tipul primitivelor utilizate n transferul mesajelor (sincrone/asincrone,
cu/fr tampon, fiabile/nefiabile).

Clientul i serverul se pot gsi n acelai nod, cnd se utilizeaz


mecanisme de comunicaie local sau n moduri diferite, cnd se utilizeaz
mecanisme de comunicaie n reea.
Introducere

1.2 URL. Scheme URL

Generaliti:

S-a pus problema unui sistem standardizat de regsire uniform a


resurselor.
Pentru a se putea referi n mod standard, n cadrul aplicaiei
Web, orice tip de document (text, imagine, sunet), a fost creat
specificaia URL (Uniform Resource Locator).
Prin URL se nelege o descriere complet a unui articol, ce
conine localizarea acestuia, articolul putnd fi un fiier de pe
maina local, sau altul din orice parte a Internet-ului.
Suportul principal pentru URL l reprezint documentul de tip
hipertext.
Acest document conine link-uri (legturi la alte servere)
normalizate de tip URL.
Hipertextul se descrie printr-un limbaj foarte simplu, care se
poate implementa n orice fiier ASCII, numit html.

Sintaxa general

Un URL complet const ntr-o schem, urmat de un ir de caractere


cu format special, care este o funcie a respectivei scheme.

[URL:] schema-de-denumire | sir

URL-ul cuprinde trei pri:

un cod pentru a identifica protocolul de transfer ce va fi


utilizat;
adresa pentru a identifica host-ul pe care sunt stocate
fiierele;
un descriptor de cale pentru amplasarea punctului (locaiei)
pe acea main.

URL-ul trebuie s nceap cu numele schemei, urmat de :, apoi


adresa locaiei unde se gsete resursa, ncadrat ntre caracterele: // i /
i opional un nume de utilizator i o parol.
Reele de calculatoare

Pentru protocoalele Internet avem urmtoarea form general:

schema://[ [nume-utilizator] [:parola]@ ] nume-de-domeniu-Internet

[:numr-port] [/lista-de-directori] [/nume-de-fisier]

Dac nu se specific numele de utilizator i parola corespunztoare,


atunci nseamn c avem de-a face cu un utilizator anonimous.

Conform cu definiia BNF a sintaxei, exist cteva scheme URL


standard, care vor fi prezentate n tabelul 1.1.

Scheme URL standard

Tabelul 1.1
PROTOCOL DESCRIERE MOD DE LUCRU
HTTP Protocol de transfer http://host[:port][/cale][?cautare]
hipertexte
FTP Protocol de transfer de ftp://[user[:parola]@]host/cale
fiiere
MAILTO Adresa de E-mail mailto:user@host
NEWS tiri Usenet news:grup-discutii
NNTP tiri Usenet pentru acces nntp:grup/cifre
local NNTP
FILE Acces la fiiere file://host/cale
TELNET Referire la o sesiune telnet://host[:port]
interactiv

Tipuri de URLuri:

relative - exp: doc/document_html;


absolute - exp: met_acces://nume_server[:port]/cale/.

Termeni UR*:

URI Universal Resource Identifier este numele pentru


identificatorul generic WWW. Specificaiile URI definesc sintaxa pentru
codificarea arbitrar a schemelor i conin o list a acestor scheme.
Introducere

URL Uniform Resource Locator este o reprezentare compact a


locaiei i a metodei de acces pentru resursele disponibile pe Internet. Cnd
este coninut ntr-un document de baz, URL-ul n forma sa absolut conine
un tip de informaie care este deja cunoscut de serverul destinaie,
facilitnd astfel transferul fiierelor.

URN Uniform Resource Name este o schem particular care


include autenticitate, reproducere i disponibilitate pentru URL-uri, nefiind
un URL n adevratul sens al cuvntului.

URC Uniform Resource Characteristics reprezint un set de


atribute care descriu un obiect, cum ar fi: autorul, publicistul, tipul de dat,
data calendaristic, elemente de copyright i dimensiunea documentului.

1.3 Hipertext, hiperlegtur, hipermedia

Hipertext este un text ce conine legturi numite hiperlegturi sau


ancore, ctre alte texte sau informaii. Urmrind aceste legturi, cititorul se
poate deplasa n interiorul unui document sau de la un document la altul. O
hiperlegtur leag textul curent cu alt informaie aflat undeva n Internet
sau cu o nou locaie din cadrul documentului curent.

Hiperlegturile sunt evideniate n cadrul browser-ului n mod grafic


cu o culoare i/sau subliniate. Un singur click cu mouse-ul pe fiecare fraz
superluminat i browser-ul va urmri automat acea legtur i va afia pe
ecran o nou informaie.

Trebuie specificat c nu este necesar citirea linie cu linie a acestui


hipertext. Umrind un anumit set de legturi, cititorul poate naviga nainte
sau napoi n cadrul unui singur document, n timp ce alte legturi l pot
purta n oricare punct din cadrul oricrui alt document din cadrul Web-ului.

n prezent, termenul hipertext semnific doar textul de baz al


documentului. Multe alte documente din Web sunt hipermedia, coninnd
imagini i legturi cu grafice, animaie i sunete.
Reele de calculatoare

1.4 Protocolul HTTP (Hypertext Transfer Protocol)

Caracteristici:

Este cel mai important i cel mai des folosit protocol al Reelei
Mondiale (Web).
Este un protocol rapid, special proiectat pentru mediul interactiv,
hipermedia din Web.
Este un protocol de nivel aplicaie, ce ofer uurina i viteza
necesare dezvoltrii aplicaiilor hipermedia.
Este un protocol generic, orientat obiect, care poate fi folosit cu
uurin de multe task-uri, cum ar fi servere de nume i sisteme
de management distribuit, cu extensiile cerute de metodele sale.
Permite tiprirea i negocierea reprezentrii datelor, construirea
de sisteme independente de date care vor fi transferate.
Este orientat pe conexiune i asigur recepionarea sigur a
pachetelor de date, oferind i o metod de control al fluxului
ntre hosturile surs i destinaie.
Este construit peste serviciile protocolului TCP/IP, care
garanteaz c datele au fost recepionate corect, nu au fost
pierdute, duplicate sau recepionate n alt ordine fa de cea n
care au fost transmise. Procesul de recepie are controlul asupra
vitezei la care se recepioneaz i se transmit datele, prin
mecanismul de fereastr glisant.
Cnd se starteaz o aplicaie, modulul HTTP al calculatorului-
client i modulul HTTP al calculatorului-server ncep s
comunice unul cu altul.
Aceste dou module (client i server) conin informaii de stare
care definesc un circuit virtual. Acest circuit virtual consum
resursele att ale serverului, ct i ale clientului. Circuitul virtual
este full-duplex, datele pot circula n ambele direcii simultan.
2 FTP i pota electronic
2.1 Serviciul FTP - Transfer de fiiere

Caracteristici:
Permite transferul fiierelor de orice tip (fie ele binare sau de
tip text) ntre dou calculatoare din Internet.
Este bazat pe un sistem de autentificare a utilizatorilor.
Exist servere publice, sau cele care ofer FTP anonim.
Exist un cont special, numit anonymous (sau ftp), care nu
este protejat prin parol i pentru care majoritatea serverelor
moderne cer introducerea ca parol a adresei de pot
electronic a utilizatorului client.
n mod normal, pentru accesul la documentele de pe un server
FTP, un utilizator trebuie s dein un nume de cont i o
parol valid pentru respectivul server.
Parola este transmis n clar prin reea, permind oricrui
utilizator local care are acces la un program de monitorizare a
reelei s o afle. Din acest motiv, transferul de informaii prin
FTP se va efectua doar n zone n care se tie c nu este
posibil monitorizarea reelelor de ctre orice utilizator. O alt
posibilitate este folosirea de clieni sau servere modificate,
astfel nct transferul s se realizeze prin canale sigure (de
exemplu, folosind SSL - Secure Sockets Layer).
Browserele cunosc nativ i protocolul FTP (schema URL este:
ftp://[cont@]server.domeniu/ ).
Protocolul este FTP (File Transfer Protocol) i este specificat
n RFC 454.
Funcioneaz pe modelul client-server.

2.1.1 Server FTP

Caracteristici:
Importana serviciului FTP este indicat i de faptul c toate
sistemele Unix sunt instalate cu un set de programe client i
server.
Reele de calculatoare

Utilizeaz 2 porturi:
portul 21 - pe care se transmit comenzile de la client la
server;
portul 20 - de pe care serverul iniiaz conexiunea pe
care se va face transferul de informaie.

Trebuie verificat dac exist n fiierul /etc/services o


intrare care s fac asocierea dintre numele simbolic ftp i 21,
numrul de port TCP cu care este asociat acest serviciu. n
fiierul /etc/services trebuie s existe urmtoarele linii:
ftp 21/tcp;
ftp-data 20/tcp.

Cnd serviciul FTP este pornit de ctre super-serverul inetd,


administratorul trebuie s se asigure c fiierul de configurare
a programului inetd (/etc/inetd.conf) conine o linie de
forma:
ftp stream tcp nowait root /usr/sbin/ftpd
ftpd

n sistemele Windows, FTP trebuie instalat explicit, fie ca serviciu de


reea, fie ca parte a server-ului Web (IIS - Internet Information Server).

2.1.2 Client FTP

Suita programelor care includ clieni FTP variaz de la cele care


dezvolt i administreaz servere WWW (Microsoft FrontPage, Macromedia
Dreamweaver) la cele de aplicaii de birotic (Microsoft Office, existnd
variante care integreaz perfect clientul FTP cu Windows Explorer).
Programele "ascund" comenzile clientului ftp din linia de comand,
majoritatea punnd accent sporit pe transferul informaiilor de la client la
server, spre deosebire de situaia clasic, n care transferul majoritar era de la
server la client.
Clientul pe staia utilizatorului, poate fi:
comanda ftp - de al prompt-ul DOS;
un program sub SO Windows (exp: WinFTP);
tasta upload al browser-ului Internet Explorer, folosind
schema URL:
ftp://user@infocib.ase.ro/cale_HOME/
FTP i pota electronic

Exist mai multe modaliti de transfer. Vom exemplifica modul din


prompt MS-DOS:
c:\>ftp
>? v arat toate subcomenzile ftp
>o infocib.ase.ro - deschide conexiunea cu server-ul de ftp de pe
infocib
user: contul_vostru
password: parola_voastra
>lcd c:\director_local schimb directorul de pe maina local,
acolo unde se gsesc fiierele voastra/ sau unde dorii s le punei
pe cele aduse
>bin trecerea modului de transfer din ASCII n binar; se
recomand pentru fiiere ZIP, EXE, imagini etc.
>hash vizualizarea transferului fiecrui 2048 B
>cd director_server schimb directorul din home directory-ul
user-ului
>put fis.ext pune fiierul din directorul local curent pe server-ul
infocib, n directorul din home-ul utilizatorului
>mput *.ext multiple put pune toate fiierele cu extensia .ext,
cernd confirmare la fiecare
>get fis.ext ia de pe server i pune pe local
>mget * - multiple get
>quit nchidere sesiune

2.2 Serviciul de pot electronic e-mail

Cunoscut i sub denumirea de e-mail (electronic mail), este cel care a


stat la baza dezvoltrii Internet-ului, datorit caracteristicii sale de a permite
trimiterea de documente electronice ntre utilizatorii conectai la reea.
Funcionarea serviciului poate fi considerat asincron, n sensul c
emitorul i receptorul nu trebuie s fie simultan conectai pentru ca mesajul
s ajung de la surs la destinaie.
Principalele componente sunt:
1. agentul utilizator (UA - User Agent), care este de obicei
un program cu care utilizatorul i citete i trimite pota
electronic;
2. serverul de pot electronic (cutia potal), locul n care
ajunge pota electronic i din care agentul utilizator preia
pota;
Reele de calculatoare

3. agenii de transfer (MTA - Mail Transfer Agent), care


preiau mesajele de la UA i le retransmit prin reea ctre
cutia potal a destinatarului.

Andrei Bogdan

Agent Utilizator (UA)


Agent Utilizator (UA)

POP, IMAP
SMTP

Agent postal (MTA)

Agent postal (MTA)

SMTP
Agent postal (MTA) Agent postal (MTA)
Cutie postala pentru Andrei Cutie postala pentru Bogdan

Figura 2.1 Modul de transmisie a potei electronice i protocoalele utilizate


n cadrul acestui sistem

La terminarea compunerii unei scrisori, agentul utilizator o plaseaz


ntr-o coad prelucrat de agentul de transfer. Acesta ateapt ca n coada sa
de intrare s fie plasat o scrisoare, pe care o trimite tuturor destinatarilor.
Pentru a trimite scrisoarea unui destinatar, agentul de transfer acioneaz ca
un client i contacteaz serverul mainii de la distan n care se afl cutia
potal a destinatarului. Clientul stabilete o legtur TCP cu serverul i i
trimite mesajul, n conformitate cu protocolul SMTP (Simple Mail Transport
Protocol). Serverul primete mesajul i plaseaz copia scrisorii n cutia
corespunztoare destinatarului. Programul de transfer este optimizat s
trateze mpreun toi recipienii situai ntr-o aceeai main distant.
Pentru comunicarea ntre utilizatorii diferitelor sisteme de pot
electronic s-au introdus pori de pot electronic (realizeaz conversia ntre
formatele de mesaje proprietare i permit, astfel, transmiterea mesajelor
dintr-un sistem n altul).
Pota electronic are faciliti importante de retransmitere a mesajelor
ctre unul sau mai muli destinatari. Programul care realizeaz retransmiterea
FTP i pota electronic

folosete o baz de date, din care afl cum trebuie s prelucreze mesajul.
Fiecare intrare n baza de date, numit list potal (mailing list) are propria
sa adres potal i conine o mulime de adrese. La sosirea unei scrisori,
programul examineaz adresa de destinaie i determin dac aceasta
corespunde unei liste potale. Dac da, atunci programul retransmite o copie
a mesajului ctre fiecare adres din list.
Programul de retransmitere consum resurse importante (memorie i
timp). De aceea el este gzduit de un sistem care ofer aceste resurse, numit
poart potal (e-mail gateway). Listele pstrate de porile potale sunt, de
obicei, publice.
Mesajele de pot electronic sunt compuse din trei pri, primele
dou fiind descrise n cadrul RFC 822:
antet: zon care cuprinde informaiile de control ale mesajului
(adresele emitorului i receptorilor, data expedierii, traseul mesajului
etc.);
mesaj: cuprinde mesajul propriu-zis;
fiiere ataate: sunt de regul binare i nsoesc mesajul principal.

Din punctul de vedere al utilizatorului, cele mai importante


cmpuri ale antetului se refer la adresa destinatarului (sau ale
destinatarilor). Cmpul to: specific o list de adrese de pot electronic,
fiecare destinatar din cei menionai n aceast list urmnd s primeasc o
copie a mesajului. Cmpul cc: (de la carbon copy, copie la indigo)
specific, de asemenea, o list de persoane care vor primi copii ale
mesajului. Atunci cnd se dorete trimiterea mesajului ctre un destinatar,
fr ca receptorii s cunoasc acest lucru, se poate folosi cmpul bcc: (blind
carbon copy, copie la indigo invizibil).
Adresele de pot electronic au formatul general
utilizator@server_pot, unde utilizator este numele de cont sau un
pseudonim al destinatarului, iar server_pot este adresa staiei care face
serviciul de cutie potal sau un nume de domeniu.

Protocoale implicate n transferul potei electronice pe Internet:

1. SMTP (Simple Mail Transport Protocol) unul dintre cele mai


importante protocoale de comunicaie ntre MTA-uri, definit n RFC 821.
El este folosit att pentru comunicarea ntre agenii de transport al potei, ct
i pentru transmisia mesajului de la agentul utilizator ctre serverul local de
transmisie a potei electronice (care, n mod uzual, este acelai cu serverul
care menine cutiile potale).
Reele de calculatoare

2. Post Office Protocol, definit n RFC 1225. Versiunea sa cea


mai utilizat se numete POP3 permite descrcarea potei de pe serverul
central, iar modelul de lucru implementat este decuplat (off-line).
Presupune existena a dou cutii potale, una pentru recepie
(cea de pe server) i una de lucru (cea gestionat de agentul
utilizator).
Sincronizarea ntre cele dou cutii potale nu este prevzut
explicit n cadrul protocolului i este, practic, imposibil de
realizat o meninere unitar a potei electronice n cazul n
care utilizatorul nu folosete ntotdeauna acelai calculator
pentru a-i accesa pota.
Serverul POP3 lucreaz pe maina pe care se afl cutia
potal.
Clientul POP3 se execut pe PC-ul utilizatorului. La apelul
su, clientul POP3 face identificarea utilizatorului (nume-
parol), apoi legtura cu serverul POP3. Acesta acceseaz
cutia potal a utilizatorului i transmite clientului noile
scrisori aflate aici. POP3 folosete tot protocolul TCP, ca i
SMTP, dar este diferit de acesta.
Sistemul care pstreaz cutia potal gzduiete dou servere,
unul SMTP i unul POP3. Serverul POP3 poate fi folosit i cu
conexiuni comutate (dial-up).

3. IMAP (Interactive Mail Access Protocol) definit n RFC


1064, ajuns la versiunea 4. Se folosete pentru a se nltura deficienele
constatate n POP3.
Acesta permite ca agentul utilizator s lucreze cu copii
temporare ale mesajelor, iar toat gestiunea mesajelor este
meninut pe server.
Modul de gestiune folosit de produsele bazate pe IMAP este
cuplat (on-line). Aceast abordare este comod pentru
utilizatorii care nu au un punct fix de lucru, fiind adaptat
pentru reele de tip Intranet.

4. DMSP (Distributed Mail System Protocol) definit n RFC


1056; presupune existena mai multor cutii potale i permite transferul
scrisorilor ctre o staie de lucru, dup care se deconecteaz. Dup
reconectare, scrisorile sunt retransferate i sistemul este resincronizat.
FTP i pota electronic

Ambele protocoale au dou mari deficiene: autentificarea se face pe


baza unei parole care circul n clar prin reea iar mesajele aduse de la server
sunt transferate n clar.

Servicii de directoare:
LDAP (Lightweight Directory Access Protocol) - protocol uor de
acces la cataloage.
Serviciul de directoare este folosit, n special, n legtur cu
sistemul de pot electronic deoarece i furnizeaz acestuia att
adrese, ct i certificate necesare pentru criptarea i semnarea
mesajelor de pot.
Se poate construi o agend cu informaii despre persoanele
implicate n sistemul de pot, printr-un serviciu centralizat de
directoare i clieni LDAP (att Netscape, ct i Microsoft au
adoptat LDAP).

Transferul documentelor prin intermediul potei electronice:


Prin facilitatea de ataare a documentelor la un mesaj de pot
electronic este posibil transmiterea unui fiier binar, nu numai
text, de la emitor ctre destinatar. Pentru o transmisie corect i
o identificare uoar a tipului documentului ataat, transferul se
face conform standardului MIME.
Documentele binare sunt codificate conform standardului
BASE64, care specific transformarea unei secvene de 3
caractere pe 8 bii ntr-o succesiune de 4 caractere care pot fi
tiprite (litere, cifre, semne de punctuaie), reprezentate pe 6 bii.
Tipul documentului ataat este indicat n antetul mesajului de
pot electronic, folosindu-se codificarea bazat pe tipurile
MIME. Tipul documentului permite programelor de pot
electronic s lanseze n execuie programul care tie s
vizualizeze documentul ataat recepionat.
La sistemele Unix, unde se utilizeaz programul mail pentru
trimiterea mesajelor, fierele se ataeaz cu comanda ~r nume_fi
n corpul mesajulul. Implicit SMTP-ul permite transfer de
documente ASCII. Cele binare trebuie trimise dup ce li s-a
aplicat uuencode, iar la recepie se va face uudecode.

Caracteristici MIME:
MIME (Multipurpose Internet Mail Extensions) - standard definit
pe parcursul a mai multor documente RFC: 1521, 2045, 2046,
2047, 2048 i 2049.
Reele de calculatoare

Cel mai folosit mod de specificare a tipului de coninut.


Dezvoltat iniial pentru a permite introducerea n cadrul mesajelor
de pot electronic a unor noi tipuri de informaii pe lng cele
clasice de tip text. Sistemul MIME a fost preluat i de Web prin
protocolul HTTP. Din acest motiv, tipurile documentelor sunt
cunoscute i sub numele de tipuri MIME. Identificatorul de tip
este definit ca fiind compus dintr-un tip i un subtip, cele dou
componente fiind separate printr-un slash.
Este o completare a RFC 822, introducnd alte 5 antete de
mesaje: MIME-version, Content-Description, Content-ID,
Content-Tranfer-Encoding, Content-Type, precum i 7 tipuri (text,
image, application, message, multiplart etc.) cu mai multe
subtipuri.

Tipuri/subtipuri MIME
Tabel 2.1
Tip/subtip Tipul informaiei asociate
MIME
text/plain Informaie de tip text care nu necesit interpretri
speciale
text/html Document ce conine o pagin HTML
image/gif Document de tip imagine codificat conform
standardului GIF
image/jpeg Document de tip imagine codificat conform
standardului JPEG
application/octet- Fiier binar, cu tip nespecificat, care trebuie tratat ca un
stream ir de octei
video/mpeg Film codificat conform standardului MPEG

Pentru transferul mesajelor n siguran, exist dou variante:


Criptarea canalului de comunicaie se face prin intermediul
unui protocol sigur, de tipul SSL (Secure Sockets Layer). Practic,
nainte de nceperea "discuiei" dintre agentul utilizatorului i
cutia potal, se stabilete un canal criptat pe care se va face att
autentificarea, ct i transferul mesajelor. Soluia rezolv ambele
probleme ale sistemelor de pot. La ora actual, singurul client
de pot electronic folosit pe scar larg care este capabil s
stabileasc conexiuni SSL este Netscape Messenger, atunci cnd
acceseaz o cutie potal de tip IMAP.
FTP i pota electronic

Criptarea mesajului - las deschis problema autentificrii cu


cutia potal, dar rezolv att problema transferului sigur al
mesajului, ct i pe cea a verificrii identitii emitorului. De
exemplu, soluia de tip PGP poate fi implementat cu succes n
medii Windows i Unix, asigurnd integrare cu toi clienii de
pot electronic.

Problema autentificrii n siguran a utilizatorului cu cutia potal


poate fi rezolvat att prin criptarea canalului de comunicaie, ct i prin
extensiile aduse celor dou protocoale care gestioneaz pota electronic de
la client. Astfel, protocolul IMAP prezint un mod opional de criptare doar
pe perioada autentificrii, iar firma Microsoft a adus unele extensii
protocolului POP3 (mecanismul SPA - Secure POP Authentication) care au
fost nglobate n clienii de mail Outlook i Outlook Express. Din pcate,
aceste soluii nu au un sprijin important din partea productorilor de servere
de pot electronic sau din partea productorilor de clieni.

2.3 Exerciii

1. Studiai RFC-urile menionate n seminar (pentru ftp, e-mail, SMTP,


POP3, IMAP, MIME)
2. Verificai existena serverelor de ftp, e-mail, pop3 pe infocib (ps aux)
i portul pe care ruleaz (netstat a)
3. Pornii i testai serverul de ftp din PWS (Personal Web Server),
folosind consola de management MMC (se lanseaz din Internet
Service Manager)
4. Creai-v un cont de e-mail pe http://mailcom.ase.ro. Citii-v
e-mail-ul folosind un client de e-mail configurat pentru POP3, IMAP,
apoi folosii un browser.
5. Citii-v pota de pe infocib folosind un client de e-mail sub SO
Windows (folosii POP3).
6. Recapitulai programul mail din Unix. Trimitei prin acest sistem
(cu SMTP) un fiier binar (uuencode/ uudecode).
3 Servere Web

3.1 Introducere

Un server WWW este un program care rspunde pe o conexiune TCP


i furnizeaz servicii unuia sau mai multor clieni.

Exist o mare varietate de servere Web pentru diferite forme de date,


ca de exemplu:

Apache - pentru platforme Unix, Windows. Conine negocieri,


fiiere log extinse.
CERN - pentru platforme Unix, VMS. Conine instrumente de
cutare i faciliti de autorizare a accesului.
NCSA - pentru platforme Unix; server public.
IIS (Internet Information Server) pentru WinNT Server, XP.
PWS (Personal Information Server) pentru Win.95/NT
Workstation.

3.2 IIS

Serverul de Web IIS (Internet Information Server) are urmtoarele


caracteristici:

Internet Information Server server de Web pentru SO


Windows NT Server, Windows 2000 Server Family.
Ajuns la versiunea 5.0, disponibil cu Windows 2000 Server.
PWS Personal Web Server pentru Win 9x i NT
Workstation, disponibil cu Option Pack 4.

Elemente de securitate:

Restricii IP i de domenii Internet se poate da/lua accesul la


anumite pagini n funcie de adresa IP sau de domeniul de la
care se conecteaz utilizatorul;
Servere Web

Comunicaii sigure prin SSL (Secure Socket Layer) i TSL


(Transport Layer Security);
SGC (Server-Gated Cryptography) extensie a SSL, care
permite utilizarea de criptri pe 128 bii;
Stocare de certificate de autentificare integrat cu Windwos
CryptoAPI; gestionarea se realizeaz prin componenta
Windows Certificate Manager;
Autentificare rezumat (digest authentification) permite
autentificarea utilizatorilor prin servere proxy i ziduri de
protecie; include autentificare Windows pentru accesul la
paginile deWeb;
Kerberos v5 protocol de autentificare integrat n Win2000
care permite trecerea elementelor de autentificare printr-o
reea de calculatoare Windows;
Fortezza standard de securitate al guvernului USA; asigur
confidenialitatea, integritatea, autentificarea i controlul
mesajelor, componentelor i sistemelor;

Administrare:

crearea de servere virtuale (porturi diferite, IP acelai sau


diferit) i directoare virtuale (alias utile cnd paginile pe
Web se gsesc pe mai multe drive-uri ale calculatorului; sunt
reprezentate prin icoana cu glob ntr-un col);

contorizarea proceselor pentru fiecare server de Web care


ruleaz.
limitarea % CPU pentru procesele ASP, ISAPI, aplicaii CGI;
setri pentru drepturile de acces: Read, Write, Execute, Script
la nivel de site, director sau fiier;
administrare la distan prin Web; fiecare site suport i un
Operator, cu drepturi restrnse;
administrare centralizat prin MMC (Microsoft Management
Console) include programe numite snap-ins;
Reele de calculatoare

protecia aplicaiilor IIS ofer 3 niveluri:

Low (IIS Processes) aplicaiile ruleaz n acelai


process ca i serviciile Web (Inetinfo.exe)
Medium (pooled) - implicit; aplicaiile ruleaz
ntr-o alt instan a DLLHost.exe;
High (Isolated) - aplicaiile ruleaz n procese
diferite de serviciile Web (DLLHost.exe).

3.3 Exerciii IIS

1. Verificai existena IIS: port, director, proces, serviciu;


2. Verificai dac exist c:\Inetpub (directorul rdcin al IIS), respectiv
directoarele wwwroot, ftproot pentru serverele de web i ftp;
3. Verificai dac ruleaz InetInfo.exe (serverul ca serviciu) (CRTL-
ALT-DEL -> Task Manager -> Processes) (Control Panel->
Services);
4. Lansai pagina implicit a IIS (http://localhost/);
Servere Web

5. Lansai Computer Management;


6. Vizualizai setrile implicite ale serverului implicit IIS (home
directory, port, drepturi etc);
7. Creai un site pe portul 8000 cu numele grupei. Dai drept de browse;
punei un fiier cu extensia .html n directorul setat ca root pentru
documentele serverului. Verificai site-ul;
8. Modificati fiierul implicit de pornire n index.html (n consola de
management), apoi redenumii fiierul dvs. n index.html, dup care
rencrcai site-ul;
9. Vizualizai porturile ocupate (netstat a n|more)
10. Din consola de management, creai un director virtual cu numele
dumneavoastr n site-ul creat anterior i dai drept de browse pe acel
director (n afar de cele implicite). Refacei paii cu fiierul default;
11. Din Sharing, creai un alt director virtual n acelai site, dup care
testai-l. Facei n aa fel nct accesul s se realizeze pe baz de cont
de Windows cu parol.

3.4 NCSA

Crearea unui server http


utilizarea un server deja existent, de exemplu
www.infocib.ase.ro
crearea propriul server: gata compilat sau sub form de surse.

Caracteristici NCSA:

Codul surs al versiunii httpd_1.3 are apte directoare: cgi-bin, conf,


icons, logs, cgi-src, src, support, dintre care ultimele trei conin fiiere
"makefile", prin care se compileaz produsul. Utilizatorul trebuie s modifice
anumii parametri doar din makefile-ul directorului src.
Produsul httpd_3.0 compilat dup aplicarea utilitarelor uncompress i
tar se obin directoarele:
1. BIN cu fiierul httpd.
2. CONFIG cu patru fiiere de configurare.
3. ICONS cu fiiere de tip .gif i .xbm.
4. CGI-BIN pentru fiier cgi.
5. LOGS pentru a se vedea logrile/erorile de logare.
6. HTDOCS pentru fiierele de tip .html.
Reele de calculatoare

Se bazeaz pe CGI i utilizeaz programe de criptare.


Exist trei tipuri de configurare a serverului:
prin compilarea sursei httpd, avnd de modificat variabile n
/src/Makefile i /src/config.h (la versiunea de la NCSA);
modificarea fiierelor de configurare cu parametri specifici
sistemului;
configurare n timpul rulrii.

Principalele tipuri de fiiere i directivele care trebuie configurate


sunt:
httpd.conf fiierul de configurare al serverului conine
informaii referitoare la:
ServerType tipul serverului (stand-alone sau inetd);
ServerRoot locaia unde se gsete daemon-ul; de exemplu:
/usr/etc/httpd;
ServerName aliasul DNS, adic numele serverului WWW,
sub forma n care este nregistrat. De exemplu
www.infocib.ase.ro (orice server nou creat de forma www sau
de alt form trebuie s fie nregistrat pentru a putea fi utilizat
i de alii);
AccessConfiguration i ResourceConfiguration calea fizic
pe care se gsesc fiierele de configurare pe server; de
exemplu: conf/access.conf, conf/srm.conf;
Port indic portul pe care httpd-ul va asculta cererile
clienilor; este o valoare ntre 0-65536; implicit este 80;
srm.conf fiierul de configurare al resurselor serverului, cum ar
fi amplasarea documentelor i a scripturilor CGI.
DocumentRoot - directorul ce conine fiierele pe care le pune
la dispoziie httpd-ul; exemplu: /usr/etc/httpd/htdocs;
UserDirectory directorul ce specific un subdirector pe care
trebuie sa-l creeze utilizatorii pentru html-urile proprii. Pentru
ca userii s poat scrie n acel director trebuie comutat de pe
"disable", care este implicit, i pus pe "enable".
Redirect creeaz un document virtual pe server;
Alias creeaz o legtur ntre un document/director virtual
de pe serverul de Web i un document/director de pe
calculatorul server;
ScriptAlias indic directoarele care sunt autorizate s
includ script CGI.
Servere Web

access.conf - fiierul de configurare al accesului definete


politica de limitare a dreptului de acces la diferitele documente
ale serverului.

Att n zona sistem, ct i n home-ul utilizatorilor trebuie s existe


directorul Web, unde se depun documentele .html. Utilizatorii i creeaz
directorul Web, n cadrul home directorului. Pentru ca ceilali utilizatori s
aib acces la acest director, trebuie s i se pun atributele de read i execute
pentru alii. Accesul la fiiere se va face astfel:
http://www.default.server/~username/nume_fiier.html

Exemplu de fiier httpd.conf:


port 80
User nobody
Group #2
ServerAdmina dmin_nume@www.infocib.ase.ro
ServerRoot /usr/local/etc/httpd
ErrorLog logs/error_log
TransferLog logs/httpd.pid
ServerName www.infocib.ase.ro
DocumentRoot /usr/local/etc/httpd/htdocs
UserDir Web
DirectoryIndex index.html
FancyIndexing on
DefaultIcon /icons/unknown.xbm
ReadmeName README
HeaderName HEADER
IndexIgnore */.??* *~ *# */HEADER* */README*
AccessFileName .hhtaccess
DefaultType text/plain
Alias /icons/ /usr/local/etc/httpd/icons
Alias /info/ /usr/local/etc/httpd/htdocs/info
Alias /document/ /u/pub/document
ScriptAlias /cgi-bin/ /usr/local/etc/httpd/cgi-bin

Configurarea accesului pentru directorul htdocs, ce conine


documentaie:
< Directory/usr/local/etc/httpd/htdocs>
OptionsIndexes FollowSymLinks
Allow Override All * pentru .htaccess files
< Limit GET >
Reele de calculatoare

Order Allow, Deny


Allow from all * implicit este Deny
< / Limit >
< / Directory >
Etapele de instalare a serverului httpd:
prin rularea stand-alone serverul se execut ca un daemon
clasic. El ateapt sosirea conexiunilor i servete cererile. La
fiecare cerere a clientului creeaz o copie a sa. Este o cale
mult mai rapid (recomandat);
din inetd (Internet Daemon) serverul este administrat
printr-un superdaemon care ascult un port TCP/IP i se
ocup cu lansarea procesului httpd la fiecare cerere a unui
client (inetd-ul facnd swap ctre httpd). Acesta este pornit
printr-un fiier de comand, de exemplu /etc/rc.local i ruleaz
continuu ca un daemon de "sendmail". Pentru aceasta trebuie
introdus comanda: "/usr/etc/httpd &" n rc.local sau rc;
Se poate renuna la semnul de background "&", dac fiierul
de configurare /etc/httpd.conf se gsete la locul implicit i
este specificat i portul pe care trebuie s asculte.
Dac se utilizeaz modul stand-alone, pe sistemele Unix, doar root-ul
poate rula httpd pe porturi mai mici dect 1024, care sunt privilegiate, ceilali
useri avnd acces de la 1024 n sus. Un exemplu de form de rulare a
serverului, poate fi:
httpd [-d director_iniial_server] [-f fisier_de_configurare][-v] unde
-v este opiunea pentru afiarea versiunii de server http.
Forma general de lansare a unui server httpd este urmtoarea:
httpd [-opt -opt -opt ...] [director] unde opt poate fi:
-r fiier_de_Configurare, cel folosit drept fiier de configurare. n
cazul n care nu se pune, implicit se consider /etc/httpd.conf;
-p port, portul de ascultare. Porturile mai mici dect 1024 sunt
privilegiate. Fr acest argument se consider c se ruleaz ca
"inetd" i utilizeaz stdin i stdout drept canale de comunicaie;
-l log_fiier nregistreaz cererile de conectare;
-restart, restarteaz un httpd ce deja ruleaz, rencrcnd fiierele
de configurare i redeschiznd fiierul de login (log file);
-gc_only, doar pentru opiunea de "proxy";
-v, verbose comut pe colectorul de depanare;
-vv, very verbose comut pe mult mai multe mesaje de
depanare;
Servere Web

-version afieaz versiunea de httpd i libwww (The WWW


Common Library);
-dy d posibilitatea vizualizrii (navigrii) coninutului
directorilor, acetia devenind nite documente hipertext. Acest
opiune se poate seta i din directiva de configurare DirAccess;
-dn nu permite vizualizarea directorilor; o aciune de ncercare a
accesului n directori va genera un mesaj de eroare;
-ds vizualizare selectiv a directorilor, accesul fiind permis doar
pentru cei coninui n fiierul www_browsable;
-dt pentru toi directorii navigabili care conin un fiier
README, incluznd textul fiierului n partea superioar a
directorului, nainte de listarea coninului directorului (se seteaz
directiva de configurare DirReadme);
-db, idem, dar pune textul fiierului README n partea
inferioar. Aceste dou opiuni pot fi combinate cu -dy, -dys, -dty,
etc;
-dr dezactiveaz includerea fiierului README.

Exemplu:

httpd -r /usr/etc/httpd.conf -p 80 este un server standalone ce ruleaz


pe portul 80, cu fiierul de configurare de mai sus.
Dac se dorete renunarea la server atunci se poate folosi:
if [-f /usr/etc/httpd]; then
(/usr/etc/httpd && (echo -n 'httpd')) & >/dev/console
fi

Dac sunt probleme la instalare, se recomand rularea cu opiunea -v


i citirea FAQ-ului corespunztor, consultarea documentaiei referitoare la
bug-uri.

3.5 Apache

Caracteristici:
Versiuni sub SO Unix (/var/apache/) i SO Windows
(c:\Apache\); structur de directoare (asemntoare cu NCSA).
Exemplificai pentru Apache sub SO Windows i sub SO Unix.
Fiiere de configurare (asemntoare cu NCSA). Exemplificai
pentru Apache sub SO Windows i sub SO Unix.
Reele de calculatoare

Documentaie http://www.apache.org/ i local, dup instalare


Apache sub SO Windows sau sub SO Unix (infocib.ase.ro:1800).
Documentai-v despre directivele care v permit crearea unor
servere virtuale.

3.6 Exerciii NCSA, Apache

1. Conectai-v pe un server de Unix (exp: infocib.ase.ro)


2. Verificai ce servere de Web ruleaz (NCSA, apache) (ps aux).
3. Unde se gsesc aceste servere? (/usr/local/etc/httpd/; /var/apache/...)
4. Pe ce porturi ruleaz (netstat a), ce versiune de software?
(httpd help)
5. Vizualizai structura de directoare i fiierele de configurare pentru
fiecare n parte.
6. Care este denumirea directorului pe care trebuie s-l creai n Home
Directory, pentru a accesa paginile voastre de Web cu serverul de
Web NCSA. Dar pentru Apache?
7. Transferai pe server fiierele .html.
8. Creai n home directory un director Web, n care mutai fiierele
.html create n seminarul anterior. Dai dreptul de citire i execuie
pentru toat lumea directorului Web, cu toate subdirectoarele sale.
9. Accesai pagina voastr de Web de pe infocib, utiliznd fiecare server
de Web instalat. (~cont). Accesai o pagin situat n alt subdirector
din Web.
10. Studiai documentaia apache sub Unix de pe server.
11. Creai un mic script SHELL (pentru a-l pune n zona cgi-bin), care s
afieze de cte ori a fost vizitat pagina voastr (opional).

APACHE sub SO Windows

1. Download kit: ftp://ecomm.ase.ro/ /apache2_0.43-win32-x86-


no_ssl.msi
2. Documentaie: --------,,------------ /apachedocs.pdf
3. Instalare:
a. alegei varianta custom
b. pornire manual pe portul 8080
c. directorul c:\apache\
Servere Web

4. Configurare:
a. Vizualizati si modificati fiierul httpd.conf, astfel nct
home-ul pentru utilizatori s fie: c:\stud_document\ (exp:
Alias /users "F:\users" ).
b. Ce module sunt ncrcate? Cum se pot ncrca celelalte? (-V,
-l).
c. Verificai dac este portul 8080 ocupat.
d. Verificai dac programul apache este pornit ca proces sau
serviciu.
e. Vizualizai structura de directori ai serverului apache. Intrai
n directorul bin.
f. Verificai ce opiuni avei din linie de comand pentru
comanda apache (apache -?).
g. Verificai configuraia (apache t). Accesai paginile noului
server.
h. Pornii serverul apache ca proces din linie de comand (nu din
meniu).
i. Testai-l pe default, ct i pentru un alt director.
j. Pornii serverul apache ca serviciu. Verificai existena
serviciului.
k. Punei n cgi-bin un script care s v afieze un contor pe
pagina voastr.
l. Verificai noul server de Web de pe acest port (apache t;
netstat -a).
m. Documentai-v n legtur cu porturile unui sistem, care sunt
ocupate, pe care le putei folosi ca utilizator privilegiat i ca
utilizator obinuit.
n. Creai un nou fiier de configurare (alt nume, alt port). Pornii
serverul cu acest fiier nou i testai-l (f file_name).
o. Intrai cu cont i parol pe directorul vostru virtual.
i. Editai httpd.conf, modificai denumirea fiierelor
.htaccess, .htpasswd:
<Directory "F:\users">
AllowOverride AuthConfig
Options None
Order allow,deny
Allow from all
</Directory>
ii. Atenie la aspectele de securitate:
<Files ~ "^htaccess">
Order allow,deny
Reele de calculatoare

Deny from all


</Files>
<Files ~ "^htpasswd">
Order allow,deny
Deny from all
</Files>

iii. Creai n directorul vostru fiierul htaccess:


AuthType Basic
AuthName "Carmen's Area!"
AuthUserFile "F:/users/carmen/htpasswd"
require user cs

iv. Creai fiierul de parole n directorul vostru:


C:\apache\bin\htpasswd c htpasswd cs

p. Creai un server virtual pe aceeai adres IP. Verificai-l.


(-t D DUMP_VHOST). (Fiierul hosts trebuie editat).
Trebuie pus i modulul LoadModule vhost_alias_module
modules /mod_vhost_alias.so? Testai noul site
(http//nume2:port).
NameVirtualHost *
<VirtualHost *>
DocumentRoot "F:/users/carmen"
ServerName carmens2
# Other directives here
</VirtualHost>

<Directory "F:\users">
AllowOverride AuthConfig
Options None
Order allow,deny
Allow from all
</Directory>
4 Utilitare TCP/IP

4.1 Utilitare TCP/IP

Utilitarele linie de comand TCP/IP prezint o mare importan,


deoarece pot fi folosite att la depanarea erorilor de configurare, ct i la
aflarea de informaii referitoare la configuraia curent.

Utilitare pentru depanarea erorilor de configurare i testarea


conectivitii
Tabel 4.1
Utilitar Descriere
ping Testeaz conexiunea cu un computer
arp Afieaz coninutul cache-ului local n care sunt stocate
adresele IP asociate adreselor fizice ale plcilor de reea
(MAC) pentru computerele din LAN
ipconfig Afieaz configuraia TCP/IP curent
nbtstat Afieaz statistici i conexiuni pentru protocolul NetBT
netstat Afieaz statistici i conexiuni pentru protocolul TCP/IP
route Afieaz sau modific tabela de rutare local
hostname Afieaz numele computerului
tracert Verific ruta pn la un computer aflat la distan
pathping Verific dac routerele de pe drumul pn la un computer aflat
la distan funcioneaz corect i n acelai timp detecteaz
pierderile de pachete de date rezultate n urma trecerii prin
diferite noduri ale reelei

Toate aceste utilitare sunt executate din linia de comand. Pentru


informaii referitoare la modul n care se folosesc, cu excepia hostname i
tracert, deschidei o fereastr de comand (Start->Programs->Accessories-
>Command Prompt), i tastai comanda, urmat de parametrul/?. Dac
informaiile afiate ncap pe mai mult de un ecran i nu le putei urmri,
folosii parametrul |more.
Pentru a folosi utilitarul hostname, trebuie doar s tastai numele
acestuia i s apsai tasta Enter. Va fi afiat numele computerului. Pentru
informaii referitoare la modul de folosire a utilitarului tracert, tastai numele
acestuia i apsai tasta Enter.
Reele de calculatoare

Utilitare pentru conectarea la distan folosind protocolul TCP/IP

Tabel 4.2
Utilitar Descriere
FTP Faciliteaz transferul bidirecional de fiiere ntre un computer
pe care ruleaz Windows i un server FTP (de exemplu,
Windows 2000 Server).
TFTP Faciliteaz transferul bidirecional de fiiere ntre un computer
pe care ruleaz Windows i un server TFTP.
Telnet Ofer o conexiune la un computer ce suport protocolul telnet.
Sistemele de operare Microsoft nu ofer suport dect pentru
clieni telnet.
RCP Copiaz fiiere ntre un computer cu Windows i unul ce ofer
suport pentru RCP (Remote Copy Protocol), de exemplu un
computer pe care ruleaz UNIX.
RSH Ruleaz comenzi pe un computer pe care este instalat UNIX.
REXEC Ruleaz un proces pe un computer aflat la distan.

Vom descrie n continuare n detaliu o serie de utilitare TCP/IP.

Utilitarul ipconfig
Ipconfig se folosete pentru verificarea configuraiei protocolului
TCP/IP. Pentru afiarea tuturor informaiilor disponibile, se folosete
parametrul /all.
Rezultatul tastrii comenzii ipconfig /all este urmtorul:
Dac este setat o configuraie valid, este afiat adresa IP i
masca de subreea, precum i gateway-ul implicit, dac este
cazul.
Dac este detectat n reea un duplicat al adresei IP folosite, va
fi afiat adresa IP folosit, dar n dreptul mtii de subreea
se va trece 0.0.0.0.
Dac Windows nu a putut obine o adres IP de la un server
DHCP, va fi afiat adresa alocat prin tehnologia APIPA.

Utilitarul ping

Ping este un instrument folosit pentru testarea conexiunii TCP/IP


ntre computerul dumneavoastr i unul aflat la distan. Ping transmite
pachetele utiliznd ICMP ECHO_REQUEST i se ateapt primirea unui
Utilitare TCP/IP

rspuns de confirmare pentru fiecare pachet transmis prin ICMP


ECHO_REPLY. Sintaxa comenzii este
ping adresa_IP_a_computerului_de_la_distan.

Utilitarul finger

Listeaz numele de login, numele complet, numele terminalului,


precum i alte caracteristici.
Opiuni - selectiv:
-b Format de redare redus
-f Suprim afiarea prii de antet
-i Afieaz o list cu timpii inactivi
-l Format de redare extins
-q Afieaz o list rapid de utilizatori

Utilitarul netstat

Comanda netstat este folosit pentru a extrage o serie de informaii


cum ar fi tabelele de rutare, coneciile active, fluxuri. Vom prezenta o serie
de opiuni folosite cu aceast comand.
-a Solicit afiarea strii socketurilor. Cele asociate cu
procesele server nu sunt afiate
-i Afieaz starea interfeelor ce au fost autoconfigurate
-m Afieaz modul de utilizare a memoriei
-r Afieaz tabelele de rutare
-p nume_protocol Limiteaz informaiile la un protocol
anume

Utilitarul traceroute

Este utilizat pentru a identifica traseul ce trebuie urmat de un pachet


pentru a ajunge la destinaie. Aceast comand lucreaz utiliznd un cmp
special TTL (time to live) din cadrul pachetului IP.

Utilitarul arp

Comanda arp afieaz i modific tabela de coresponden ntre


adrese Internet i adrese Ethernet (MAC). n momentul n care nu exist
intrri ARP pentru o anumit adres Internet se va afia un mesaj n acest
sens.
Reele de calculatoare

Opiuni:
-a Afieaz toate intrrile din tabele ARP curent
-d nume terge intrrile corespunztoare din tabela
ARP
-s adres host Creaz o nou intrare n tabela ARP folosind o
adres Ethernet

4.2 Testarea unei configuraii TCP/IP

Vom prezenta n continuare care sunt paii ce trebuie urmai pentru


verificare configuraiei computerului i pentru testarea conexiunilor la
computere aflate la distan, ce implic eventual i existena unor routere.
ipconfig
Folosii utilitarul ipconfig pentru a verifica dac a fost
iniializat configuraia TCP/IP.
ping 127.0.0.1
Folosii utilitarul ping cu adresa intern a plcii de reea
pentru a verifica dac protocolul TCP/IP este instalat corect i
placa dumneavoastr de reea l folosete.
ping adresa_IP_a_computerului_dumneavoastr
Folosii utilitarul Ping cu adresa IP a computerului
dumneavoastr pentru a elimina riscul existenei n reea a
unui duplicat al adresei IP folosite.
ping adresa_IP_a_gateway-ului_implicit
Folosii utilitarul ping cu adresa IP a gateway-ului implicit
(aceasta poate fi aflat folosind comanda ipconfig) pentru a
verifica dac gateway-ul implicit este operaional i
computerul dumneavoastr poate s comunice cu acesta.
ping adresa_IP_a_unui_computer_aflat_la_distan (pe alt
segment de reea)
Folosii utilitarul ping cu adresa IP a unui computer aflat pe
alt segment de reea (de exemplu, infocib sau nemesis) pentru
a verifica dac se poate stabili o conexiune cu un computer
aflat la distan prin intermediul unui router.

n general, dac acest ultim pas reuete, atunci ceilali pai sunt
inutili. Totui, n cazul n care nu reuete, va trebuie s urmai succesiunea
de pai de mai sus pentru a putea localiza problema.
Utilitare TCP/IP

4.3 Exemple de folosire a unor utilitare TCP/IP

Arp a afieaz coninutul cache-ului ARP (adrese IP asociate


adreselor fizice ale plcilor de reea). Folosii mai nti
comanda ping pentru ca Windows s poat stoca adresa
fizic (MAC) a plcii de reea folosit de computerul aflat
la distan.
Ex: Secvena
ping ecomm.ase.ro
arp -a
va duce la afiarea adresei MAC a serverului ecomm.

tracert adresa_IP_a_computerului_de_la_distan afieaz nodurile


de reea prin care trece un pachet de date pn s ajung la
computerul destinaie.

pathping adresa_IP_a_computerului_de_la_distan reprezint o


combinaie ntre comenzile tracert i ping, fiind testat
conexiunea cu fiecare nod de reea (router) pn la
computerul destinaie, folosindu-se comanda ping n mod
automat pentru fiecare dintre acestea.

nbtstat A adresa_IP_a_computerului_de_la_distan afieaz


numele NetBIOS al unui computer aflat la distan, n
cazul n care este cunoscut adresa IP a acestuia.

netstat a afieaz toate conexiunile stabilite n reea, precum i


toate porturile deschise pe computerul dumneavostr.
5 Adresare IP

5.1 Clase de adrese

Fiecare familie de protocoale trebuie s conin un mod de adresare,


pentru a identifica reelele i nodurile n cadrul acestora. Adresele Internet
folosite de IP sunt reprezentate pe 32 de bii i sunt alocate n mod unic la
nivel global, de o autoritate central i mai multe autoriti regionale.
Adresele pe 32 de bii sunt specificate de aa-numita vesiune 4 a IP. Recent a
fost standardizat versiunea 6 (IPv6), n care adresele se reprezint pe 128
octei.
n vederea unei alocri sistematice, adresele IP au fost divizate n
cinci clase de adrese. Dintre acestea trei (clasa A, B, C) vor fi discutate n
amnunt. Orice nod conectat ntr-o reea TCP/IP trebuie s aib o adres IP
(ruterele, care dispun de mai multe interfee de reea, vor avea cte o adres
IP pentru fiecare interfa).
A fost introdus i o convenie de scriere a acestor adrese: fiecare din
cei patru octei ai adresei este notat distinct prin numrul zecimal
corespunztor, cele patru valori fiind separate prin punct, ca n exemplul
urmtor: 123.1.232.11.
O alt convenie de scriere este urmtoarea: 20.0.0.0/12, ce denot
aplicarea unei mti de 12 bii pe adresa 20.0.0.0, adic selecteaz toate
valorile posibile n ultimii 20 bii de adres. Analog, 194.110.6.0/26 aplic o
masc de 26 biti pe adresa 194.110.6.0/, adic selecteaz ultimii ase bii de
adres (64 valori).
Recent a fost introdus i distincia ntre adrese publice i adrese
private. Se numesc adrese publice cele care sunt obinute de la autoritile de
alocare a adreselor i sunt rutate n Internet. Aceste adrese au caracter de
unicitate, n sensul c nici o adres nu este multiplu alocat. Datorit creterii
explozive a conectrilor la Internet a aprut preocuparea fa de epuizarea
adreselor pe 32 de bii i una din soluiile adoptate pentru evitarea acestui
fenomen a fost s se rezerve cteva adrese care s poat fi utilizate intern
(privat) de orice organizaie, fr a fi vizibile n afara organizaiei (nu vor fi
rutate n afara organizaiei). Astfel de adrese sunt:
10.0.0.0 - 10.255.255.255 (reea de clas A)
172.16.0.0 - 172.16.255.255 (reea de clas B)
192.168.0.0 - 192.168.255.255 (bloc de reele de clas C)
Adresare IP

Rmne la latitudinea utilizatorului alegerea adreselor private pe care


le folosete, dar aceasta trebuie fcut conform unor criterii de performan.
Unul dintre criteriile de alegere este evident dimensiunea reelei interne: dac
aceasta are doar cteva zeci de calculatoare nu se justific alegerea adreselor
private de clas B sau A.

Sintetizarea noiunilor referitoare la adresarea IP


Tabel 5.1
Denumire Descriere
Adresa IP Numr pe 32 bii, scris de obicei n format zecimal,
grupat pe cei patru octei, prin care se poate identifica n
mod unic un nod (interfa).
Adres de reea Numr pe 32 bii, scris de obicei n format zecimal,
grupat pe cei patru octei, care identific o reea.
Numrul nu poate fi asignat unui nod (interfe).
Poriunea din adres corespunztoare gazdei conine
numai valori binare de 0.
Adres de Numr pe 32 bii scris de obicei n format zecimal
broadcast grupat pe cei patru octei, utilizat pentru a adresa toate
nodurile (interfeele) din cadrul unei reele de
calculatoare. Poriunea din adres corespunztoare
gazdei conine numai valori binare de 1.
Masc de reea Numr pe 32 bii scris de obicei n format zecimal
grupat pe cei patru octei, utilizat pentru a calcula adresa
de reea prin efectuarea unui i logic ntre masc i o
adres IP.

Prin definiie, toate nodurile dintr-o reea posed aceeai valoare


numeric pentru poriunea de reea din adresele IP. Cealalt parte a adresei
IP se numete zon de gazd (host). Aceasta difer de la un nod (interfa) la
altul.
Adresele de clasa A sunt folosite n reelele cu un numr foarte mare
de noduri aflate sub aceeai autoritate (companii transnaionale, organizaii
mondiale, etc.). Adresele de clas A folosesc opt bii (un octet) pentru a
identifica reeaua. Prin urmare ceilali 24 bii sunt folosii pentru a identifica
nodurile (interfeele). Prin urmare unei reele de clas A i se pot asigna 224
noduri. Adresele de clasa B au rezervat o zon de reea de 16 bii, iar cele de
clas C au rezervat o zon de reea de 24 bii.
Reele de calculatoare

Adresele de clasa B au fost atribuite iniial marilor universiti i


companii. n ultima vreme obinerea unei adrese de clasa B este dificil.
Tabelul 2 sintetizeaz aceste caracteristici.

Caracteristici adrese
Tabel 5.2
Clas Numr de octei-bii Numr de octei-bii Numrul de
utilizai pentru a utilizai pentru a adrese
identifica reeaua identifica interfaa asignabile pe
reea*
24
A 1 (8) 3 (24) 2 -2
B 2 (16) 2 (16) 216 - 2
C 3 (24) 1 (8) 28 - 2
*Exist dou adrese rezervate pentru fiecare reea.

Adresele de reea sunt similare adreselor IP obinuite ns nu sunt


asignabile unei interfee anume. La nivel conceptual adresele de reea refer
grupul tuturor adreselor IP dintr-o reea. De exemplu adresa 7.0.0.0 identific
o reea de clas A, 130.9.0.0 identific o reea de clas B, iar 200.4.3.0
identific o reea de clas C. Tabelul 3 sintetizeaz aspectele referitoare la
adresele de reea.

Marje adrese IP
Tabel 5.3
Clas Valoarea Adrese de reea Numr de Numrul de
primului valide adrese de adrese
octet reea valide asignabile pe
reea
A 1 - 126 1.0.0.0 126.0.0.0 27 2 224 - 2
B 128 191 128.1.0.0 214 2 216 - 2
191.254.0.0
C 192 - 223 192.0.1.0 221 2 28 - 2
223.255.254.0

Exist o serie de excepii care reies i din tabelul 3. De exemplu,


adresa 0.0.0.0 este folosit ca adres de broadcast, iar adresa 127.0.0.0 este
folosit ca adres de loopback. Alte exemple de adrese rezervate ar fi:
128.0.0.0, 191.255.0.0, 192.0.0.0 i 223.255.255.0.
Adresare IP

O masc de reea standard este definit ca avnd valori binare de 0


corespunztor poziiilor din adres ce definesc host-ul. n tabelul 4 sunt
definite mtile de reea standard.

Mti de reea standard


Tabel 5.4
Clas Numr de octei-bii ce Masca de reea
identific reeaua standard
A 1 (8) 255.0.0.0
B 2 (16) 255.255.0.0
C 3 (24) 255.255.255.0

n momentul n care se dorete mprirea n subreele se aloc n


cadrul adresei IP un numr de bii care identific subreelele. Acetia sunt
preluai din cadrul zonei de host a adresei IP. Astfel, n cadrul adresei IP,
sunt definite trei zone: reea, subreea i host. Biii ce identific reeaua sunt
definii prin tipul clasei, cei de host sunt definii de ctre masca de reea
folosit, iar cei de subreea sunt obinui prin preluarea biilor rmai. De
exemplu o masc de reea de forma: 255.255.255.240, utilizat n cadrul unei
reele de clas C, determin un numr de patru bii de host.

8 24-x x

Reea Sub-reea Host

16 16-x x

Reea Sub-reea Host

24 8-x x

Reea Sub-reea Host

Figura 5.1 Structurarea unei adrese de IP

Putem face o serie de observaii privitoare la cele discutate:


Dou adrese IP unice din aceeai reea au valori identice pentru
partea de reea, diferind prin partea de host.
Reele de calculatoare

Dou adrese IP unice din aceeai subreea au valori identice n


partea de reea, n cea de subreea diferind doar prin partea de
host.
Dou adrese IP unice aflate n subreele diferite dintr-o reea de
clas A, B sau C au aceeai valoare n partea de reea i difer
prin partea de subreea.

Dac nu s-ar utiliza mprirea n subreele, cel mai mic grup de


hosturi ce s-ar putea forma ar fi echivalent cu o clas de adrese (A, B sau C
n funcie de caz). Numrul de reele disponibile ar fi insuficiente.

5.2 Exerciii rezolvate

1. Avnd adresa IP 134.141.7.11 i masca de reea 255.255.255.0 s


se specifice care este adresa care identific subreeaua.

Adresa este de clasa B; am evideniat ngroat biii care identific


subreeaua.

Adresa: 134.141.7.11 1000 0110 1000 1101 0000 0111 0000 1011
Masca de 255.255.255.0 1111 1111 1111 1111 1111 1111 0000 0000
reea:
Rezultatul: 134.141.7.0 1000 0110 1000 1101 0000 0111 0000 0000

2. Avnd adresa IP 193.193.7.7 i masca de reea 255.255.255.0 s se


specifice care este numrul care identific subreeaua.

innd cont c este vorba despre o adres de clas C, iar masca este
255.255.255.0, rezult c nu se utilizeaz mprirea n subreele.

Adresa: 193.193.7.7 1100 0001 1100 0001 0000 0111 0000 0111
Masca de 255.255.255.0 1111 1111 1111 1111 1111 1111 0000 0000
reea:
Rezultatul: 193.193.7.7 1100 0001 1100 0001 0000 0111 0000 0111

3. Avnd adresa IP 134.141.7.11 i masca de reea 255.255.255.0 s


se specifice care este adresa de broadcast pentru subreea.
Adresare IP

Adresa: 134.141.7.11 1000 0110 1000 1101 0000 0111


0000 1011
Masca de reea: 255.255.255.0 1111 1111 1111 1111 1111 1111
0000 0000
Rezultatul: 134.141.7.0 1000 0110 1000 1101 0000 0111
0000 0000
Adresa de broadcast 134.141.7.255 1000 0110 1000 1101 0000 0111
1111 1111

4. Avnd adresa IP 193.193.7.7 i masca de reea 255.255.255.0 s se


specifice care sunt adresele IP asignabile n aceast subreea.

Adresa de subreea este 193.193.7.0, iar cea de broadcast este


193.193.7.255. Adresele de IP asignabile se gsesc n intervalul 193.193.7.1
- 193.193.7.254.

5. Avnd adresa IP 140.1.1.1 i masca de reea 255.255.255.248 s se


specifice care sunt adresele IP asignabile n aceast subreea.

Adresa de subreea este 140.1.1.0, iar cea de broadcast este 140.1.1.7.


Adresele de IP asignabile se gsesc n intervalul: 140.1.1.1 - 140.1.1.6.

6. Avnd adresa IP 10.5.118.3 i masca de reea 255.255.255.0 s se


specifice care sunt subreelele ce se pot forma.

Adresa este de clas A. Acest lucru implic faptul c octeii 2 i 3


sunt n ntregime rezervai pentru identificarea subreelelor.

S1 0000 1010 0000 0000 0000 0000 0000 0000 10.0.0.0


S2 0000 1010 0000 0000 0000 0001 0000 0000 10.0.1.0
S3 0000 1010 0000 0000 0000 0010 0000 0000 10.0.2.0
S4 0000 1010 0000 0000 0000 0011 0000 0000 10.0.3.0
S5 0000 1010 0000 0000 0000 0100 0000 0000 10.0.4.0
S6 0000 1010 0000 0000 0000 0101 0000 0000 10.0.5.0

Sn 0000 1010 1111 1111 1111 1111 0000 0000 10.255.255.0

7. S se proiecteze o reea care s cuprind trei situri Ethernet legate


prin linii seriale. Reeaua poate crete pn la un numr de maxim 100 de
subreele, fiecare cu maximum 200 noduri. Se va folosi adresa de reea
Reele de calculatoare

172.16.0.0. S se determine mtile de subreea care ndeplinesc criteriile


date. Arhitectura este cea prezentat n figur.

Ruterul A

Ruterul B Ruterul C

Rezolvare

Masca trebuie s aib minim 8 bii pentru host. Dac am avea 7 bii
pentru host ar nsemna c am putea identifica 27 -2 (126) interfee, ceea ce ar
fi insuficient pentru a acoperi necesarul de 200 adrese. Numrul de subreele
necesar este 100, ceea ce implic un numr minim de apte bii rezervai,
deoarece 27 este cea mai mic putere a lui doi mai mare dect 100. Primii
16 bii vor avea valoarea 1, deoarece adresa indicat este de clas B. n
concluzie masca de subreea va avea urmtoarea form:
11111111 11111111 1111111X 00000000

Bii de reea Numrul minim Numrul minim


de bii de subreea de bii de host

Observm c rmne un bit care poate fi asignat att grupului de bii


ce identific subreeaua, ct i grupului de bii care identific hostul. Acest
bit a fost marcat cu X. Exist dou posibiliti de masc de reea:
255.255.254.0 sau 255.255.255.0. Vom continua pe primul model, deoarece
cel de-al doilea este mai simplu.
Adresare IP

Subreelele ce se pot forma sunt:


172.16.0.0
172.16.2.0
172.16.4.0
.....................
172.16.252.0
172.16.254.0

Vom selecta primele ase subreele aa cum reiese i din tabelul


urmtor:

Subreea Masc de Adres Adresa IP router


subreea subreea
Router A 255.255.254.0 172.16.2.0 172.16.2.1
Ethernet
Router B 255.255.254.0 172.16.4.0 172.16.4.2
Ethernet
Router C 255.255.254.0 172.16.6.0 172.16.6.3
Ethernet
Linie serial 255.255.254.0 172.16.0.0 172.16.0.1 (A) i 172.16.0.2
A-B (B)
Linie serial 255.255.254.0 172.16.8.0 172.16.8.1 (A) i 172.16.8.3
A-C (B)
Linie serial 255.255.254.0 172.16.10.0 172.16.10.2 (B) i
C-B 172.16.10.3 (C)

Subreeaua 172.16.2.0/23

Ruterul A

Subreeaua 172.16.0.0/23 Subreeaua 172.16.8.0/23

Subreeaua 172.16.10.0/23

Ruterul B Ruterul C

Subreeaua 172.16.4.0/23 Subreeaua 172.16.6.0/23


6 Comunicaie client-server la nivel de socket

6.1 Introducere

Vom prezenta o serie de aspecte generale:


Protocoalele TPC/IP de nivel transport ofer servicii ce permit
programelor nivelului aplicaie s comunice ntre ele prin
intermediul mesajelor.
Cnd o aplicaie trimite o cerere ctre nivelul transport pentru
a trimite un mesaj, protocolul folosit la acest nivel:
mparte informaia n pachete;
adaug un antet de pachet care include adresa
destinaiei;
trimite informaia nivelului reea pentru procesare
ulterioar.
Transmisia i recepia datelor se realizeaz prin intermediul
unor porturi de pe server, care identific destinaia specific a
mesajului.
Nivelul transport este implementat n reelele TCP/IP prin
intermediul a dou protocoale:
UDP (User Datagram Protocol) protocol
datagram utilizator;
TCP (Transmission Control Protocol) protocol de
control al transmisiei.

Caracteristici UDP:
Asigur servicii de tip datagram nivelului aplicaie;
Nu este fiabil (nu asigur certitudinea livrrii datagramelor,
nici mecanismele de protecie la pierderea sau duplicarea
datagramelor);
Vitez mare de transmisie;
Este un serviciu fr conexiune (emitorul nu cunoate starea
receptorului n momentul transmisiei);
Pentru transferul datelor folosete nite entiti abstracte,
numite porturi de protocol, identificate prin numere ntregi
pozitive i care au asociate nite cozi de mesaje prin care se
transmit mesajele;
Se utilizeaz pentru mesaje mici (sub 8KB) cu vitez mare;
Comunicaie client-server la nivel de socket

Antetul datagramei UDP conine:


Source Port Number adresa portului surs;
Destination Port Number adresa portului
destinaie;
Length lungimea datagramei n bytes;
Checksum suma de control asociat datagramei
(folosete acelai algoritm ca la protocolul IP).

Caracteristici TCP (Transmission Control Protocol):


Este fiabil (asigur integritatea datelor transmise, mecanisme
de protecie la pierderea sau duplicarea pachetelor, pstrarea
numrului de secven, mecanisme de control al fluxului de
date n reea).
Asigur transmisia blocurilor continue de date ntre porturile
de protocol asociate aplicaiilor.
Dimensiunea mesajelor nu este limitat.
Viteza de transfer mai mic.

SO ofer programelor la nivel aplicaie o interfa comun pentru


aceste dou protocoale, i anume interfaa socket.

6.2 Interfaa Socket

Este o interfa ntre un program de aplicaie i serviciul de transport


(este un standard de facto), fiind furnizat de o bibliotec socket sau de
sistemul de operare. Se folosete conceptul de descriptor, fiecare socket fiind
tratat asemntor cu un fiier local. Acest descriptor este transmis aplicaiei
la crearea socket-ului i apoi este utilizat ca argument n apelurile urmtoare.

Primitive de serviciu Socket API


Tabel 6.1
Primitive Descriere
socket(protofamily, type, protocol) creeaz un socket
close(socket) nchide un socket
bind(socket, localaddr, addrlen) leag socket-ul cu un port
listen(socket,queuesize) pune socket n mod pasiv
newsock = accept(socket, caddress, accept o cerere de
caddresslen) conectare
connect(socket, saddress, saddresslen) stabilete legtura cu un
server care a fcut accept
Reele de calculatoare

Primitive Descriere
send(socket, data, length, flags) transmite un mesaj
sendto(socket, length, flags, destaddress, transmite un mesaj folosind
addresslen) un socket neconectat
sendmsg(socket, msgstruct, flags)
recv(socket, buffer, length, flags) primete un mesaj
recvfrom(socket, buffer, length, flags, primete un mesaj pe un
sndaddr, saddrlen) socket neconectat
rcvmsg(socket, msgstruct, flags)

Proprieti ale socketurilor n Unix:


inovaie a sistemului Berkeley UNIX;
este un punct de comunicaie prin care un proces poate emite
sau recepiona informaie sub forma unui flux de bytes;
este identificat printr-un descriptor, asemntor cu cel pentru
fiier
realizeaz urmtoarele operaii elementare:
conectarea la staia de la distan
emiterea datelor
recepionarea datelor
nchiderea unei conexiuni
ataarea la un port
ateptarea cererilor de conexiune emise de staiile de la
distan
acceptarea cererilor de conexiune la portul local

O aplicaie de reea include:


un program client care creeaz un socket pentru a iniia o
conexiune cu o aplicaie server
un program server care ateapt preluarea cererilor clienilor

Structura general folosit pentru lucrul cu socketuri este:


struct sockaddr
{
unsigned short sa_family;
char sa_data[14]; //14 bytes pentru adrese
}
Comunicaie client-server la nivel de socket

Membrii structurii sunt:


sa_family identific familia de adrese;
sa_data identific adresa de socket compus din numrul
portului i adresa IP.

Pentru a lucra mai uor cu structura de mai sus se folosete o nou


structur ajuttoare sockaddr_in. Structura sockaddr este una generic (o
putem privi ca o clas abstract) menit a stoca informaii de adres pentru
oricare tip de socketuri. Structura ajut la referirea facil a elementelor
adresei de socket:

struct sockaddr_in
{
short int sin_family;
unsigned short int sin_port;
struct sin_addr;
unsigned char sin_zero[8]; //
};

Membrii:
sin_family corespunde cmpului sa_family din structura
sockaddr;
sin_port identific portul;
sin_addr identific adresa IP;
sin_zero[8] se iniializeaz cu 0.

Valorile articolelor sin_port i sin_addr trebuie s fie n forma big


endian. Pentru acest lucru va trebui s se fac conversia ntre formatul little
endian (host order) i cel big endian (network order). Pentru aceste conversii
se vor utiliza funciile:
htons() host to network short
htonl() host to network long
ntohs() network to host short
ntohl() network to host long

O alt funcie util de conversie este inet_addr(), care convertete


adrese IP din forma zecimal grupat n cea de tipul unsigned long n
formatul big endian. O alt funcie ce poate fi folosit n locul celei de mai
sus este inet_aton() cu prototipul:
int inet_addr(const char *cp, struct in_addr *inp)
Reele de calculatoare

n cazul n care avem o structur in_addr i dorim s afim adresa IP


n format little-endian, atunci putem folosi funcia inet_ntoa(), astfel:
printf ("%s", inet_ntoa(ina.sin_addr));

Vom prezenta un exemplu de iniializare a structurii sockaddr_in:

struct sockaddr_in my_addr;


my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
inet_aton( " 2 1 . 3 3 . 2 1 0 . 5 4 " , &(my_addr.sin_addr));
memset(&(my_addr.sin_zero), ' \ 0 ' , 8 ) ;

Funcia socket() creaz un socket i returneaz descriptorul de socket


(valoare ntreag prin care se identific un socket) sau 1, n caz de eroare.

#include <sys/types.h>
#include <sys/socket.h>
int socket (int domeniu, int tip, int protocol);

Parametrii funciei:
Domeniul de comunicaie poate fi setat cu valori de tipul
AF_ceva, cum ar fi: AF_UNIX stabilete domeniul de
comunicare local UNIX sau AF_INET utilizat pentru
comunicaii ntre procese aflate pe aceeai main sau pe
maini diferite, folosind stiva de protocoale TCP/IP
(domeniul Internet). Pentru exemplele curente vom utiliza
cea de-a doua variant. n acest caz, fiecare socket va avea
asociat o adres format din adresa IP a mainii gazd i un
numr de 16 bii, local gazdei respective, denumit port.
Tipul de socket utilizat: SOCK_STREAM (comunicarea se
va realiza full-duplex, sigur, orientat-conexiune prin flux
de date) sau SOCK_DGRAM (fr conexiune prin
datagrame). Se mai poate folosi i constanta SOCK_RAW care
ofer un acces la protocolul reea (protocolul IP), de nivel
inferior.
Protocol specific protocolul particular care va fi utilizat
pentru transmisia datelor. Acesta poate fi setat pe 0 pentru
ca funcia s-i poat alege protocolul corect automat. De
exemplu, pentru domeniul AF_INET i tipul SOCK_STREAM
se va considera protocolul de transport TCP, iar pentru cazul n
Comunicaie client-server la nivel de socket

care domain este AF_INET i tipul SOCK_DGRAM se va


considera implicit protocolul de transport UDP.

6.2.1 Comunicaie client-server TCP/IP

n figura 6.1 este prezentat modul de comunicaie client-server


TCP/IP.

getprotobyname ()

socket()

bind() ge thostbyname()

listen() ge tprotobyname()

acce pt() socke t()

stabilire conexiune
conne ct()

read() write ()
ce rere

write() read()
rspuns

close() close ()

Figura 6.1 Cient-server TCP/IP

Clientul apeleaz:
gethostbyname() pentru a converti numele unui calculator n
adresa IP;
getprotobyname() pentru a converti numele unui protocol n
forma binar folosit de sockets;
socket() pentru a crea un socket;
connect() pentru a conecta socket-ul la un server;
Reele de calculatoare

recv() (n mod repetat) pentru transferul tuturor datelor de la


server (clientul nu are de unde ti dac serverul transmite
datele ntr-un singur mesaj sau n mai multe);
close() pentru a nchide socket-ul.

Serverul apeleaz:
getprotobyname() pentru a converti numele unui protocol n
forma binar folosit de sockets;
socket() pentru a crea un socket;
bind() pentru a specifica portul local pentru socket;
listen() pentru a plasa socket-ul n modul pasiv, apoi n bucl;
accept() pentru a accepta o cerere de conectare i a crea un
socket nou pentru aceast conexiune;
send() pentru a trimite date;
close() pentru a nchide noul socket.

Primitivele blocante folosite sunt accept, connect (3 way handshake)


i gethostbyname (conectare cu un server de nume).

Primitiva bind() asigneaz socketul la portul mainii la care, de


exemplu, serverul va asculta cereri de conexiune din partea clienilor.
Prototipul funciei este urmtorul:

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

Parametri:
sockfd este descriptorul de socket
my_addr este un pointer la structura ce conine informaii
referitoare la adres
addrlen poate fi setat la valoarea sizeof(struct sockaddr)

Vom prezenta un model de folosire a funciei bind():

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MYPORT 3490
main()
Comunicaie client-server la nivel de socket

{
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET; // little endian
my_addr.sin_port = htons(MYPORT); // big endian
my_addr.sin_addr.s_addr = inet_addr("10.12.110.57");
memset(&(my_addr.sin_zero), '\0', 8); // iniializare cu 0 a structurii
bind(sockfd, (struct sockaddr *)&my_addr, sizeof (struct sockaddr)) ;
.................
}

Dup ataarea portului, serverul va trebui s atepte viitoarele


conexiuni de la diveri clieni i s le rezolve cererile. Pentru aceasta se
utilizeaz primitiva listen() urmat apoi de accept().

Primitiva listen() are urmtoarea form:


int listen(int sockfd, int backlog);

Parametri:
sockfd este descriptorul de socket;
backlog reprezint numrul maxim de conecii permise n
coada de ateptare.

Primitiva accept() permite acceptarea propriu-zis a conexiunilor:


int accept(int sockd, struct sockaddr *addr, socklen_t *addrlen);

Apelul va returna un descriptor de socket corespunztor clientului a


crui conexiune a fost acceptat, stabilindu-se astfel un canal de comunicaie
duplex ntre server i client. Acest nou descriptor va putea fi folosit pentru a
trimite i recepiona date via reea prin mijlocitori precum send() sau write()
i recv() sau read().
Parametri:
sockfd este descriptorul de socket
addr va conine informaii despre adresa IP i portul folosite
de clientul conectat la server,
addrlen stocheaz lungimea acestei structuri.
Reele de calculatoare

Primitiva send() ntoarce numrul de octei transmii, care uneori


difer de numrul de octei ce dorim s-i transmitem. Valoarea returnat este
numrul de octei trimii n caz de succes. Dac eueaz, este returnat -l, iar
errno descrie eroarea.
int send(int sockfd, const void *msg, int len, int flags)

Parametri:
sockfd este descriptorul de socket
msg reprezint o zon de memorie n care se afl datele ce
trebuie trimise
len reprezint lungimea datelor n octei
flags este de obicei setat pe 0

Primitiva recv() ntoarce numrul de octei recepionai. Valoarea


returnat este numrul de octei primii n caz de succes. Dac eueaz, este
returnat -l, iar errno descrie eroarea.
int recv (int sockfd, void *buf, int len, unsigned int flags);

Parametri:
sockfd este descriptorul de socket;
msg reprezint o zon de memorie n care se vor copia datele
recepionate;
len reprezint mrimea acestor date n octei;
flags este de obicei 0 sau setat la valoarea MSG_PEEK, dac
datele recepionate trebuie reinute i dup ce sunt
recepionate;

Primitivele close() i shutdown()

Primitiva close() va nchide conecia aferent descriptorului de


socket. Astfel se va bloca orice read() or write() ulterior, cel ce va ncerca
acest lucru va primi mesaj de eroare.
Primitiva shutdown() permite un control superior al procesului de
nchidere a socketurilor. Funcia are forma:
int shutdown(int sockfd, int opt);
Parametri:
sockfd este descriptorul pentru socketul ce trebuie nchis;
opt poate lua valorile: 0 (interzice orice recepie ulterioar), 1
(interzice orice trimitere ulterioar), 2 (interzice att recepia,
ct i trimiterea, similar cu close())
Comunicaie client-server la nivel de socket

Funcia ntoarce valoarea 0 n caz de success i valoarea -1 n caz de


eroare.

6.2.2 Comunicaie client-server UDP/IP

n figura 6.2 este prezentat modul de comunicaie client-server


UDP/IP.

socket() socket()

bind() bind()

cerere
recvfrom() sendto()

rspuns
sendto() recvfrom()

close() close()

Figura 6.2 Client-server UDP/IP

Mecanismul de lucru este urmtorul:


Se creaz un socket care va trata conexiunile cu clienii.
Sunt pregtite structurile de date (sockaddr_in) pentru a
ataa socketul la portul folosit de aplicaie.
Se ataeaz socketul la port (bind()).
Sunt procesate cererile clientului prin schimbul de mesaje
ntre server i client (sendto() i recvfrom()). Pot fi
utilizate i primitivele generale send() i recv().
Se nchide socketul client (close()).

Primitiva sento() este folosit pentru trimiterea datagramelor,


ntoarce numrul de octei trimii i are urmtorul prototip:
int sendto(int sockfd, const void *msg, int len, unsigned int flags,
const struct sockaddr *to, int tolen);
Reele de calculatoare

Parametrii funciei:
sockfd este descriptorul de socket;
msg reprezint o zon de memorie n care se afl datele ce
trebuie trimise;
flags va fi iniializat cu 0
len reprezint lungimea datelor ce vor fi trimise;
to reprezint un pointer la o structur de tip sockaddr i
conine adresa de IP i portul destinaiei;
tolen va fi iniializat cu valoarea sizeof(struct sockaddr).

Primitiva recfrom() este folosit pentru recepionarea


datagramelor, ntoarce numrul de octei recepionai i are urmtorul
prototip:
int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct
sockaddr *from, int *fromlen);

Parametrii funciei:
sockfd este descriptorul de socket;
msg reprezint o zon de memorie n care se afl datele ce
sunt primite;
flags va fi iniializat cu 0;
len reprezint lungimea datelor primite;
from reprezint un pointer la o structur de tip sockaddr i
conine adresa de IP i portul sursei;
fromlen va fi iniializat cu valoarea sizeof(struct sockaddr)

6.3 Exemplificri

1. S se construiasc un server i un client TCP/IP. n exemplu,


serverul va pstra evidena numrului de clieni care au accesat resursa i va
raporta acest numr la fiecare apel.

/* SERVER TCP */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
#include <netdb.h>
Comunicaie client-server la nivel de socket

main(int argc, char ** argv)


{
unsigned short port; /* portul client */
char buffer[32];
struct sockaddr_in client, server; /*adresele client, server*/
struct hostent * srvinfo;
int s, rc, namelen, ns;
if(argc!= 2)
{
printf("Apel: %s port \n", argv[0]);
exit(1);
}

/*preia numele calculatorului local */


if(gethostname(buffer, 32))
perror("Eroare la preluarea numelui serverului");
printf("Nume server: %s \n", buffer);

/*preia informatiile despre configurarea hostului*/


if (!(srvinfo=gethostbyname(buffer)))
perror("Eroare la preluarea informatiilor despre server");
port=(unsigned short) atoi(argv[1]);

/*Creeaza un socket*/
if ((s=socket(AF_INET, SOCK_STREAM, 0)) <0)
{
perror("Eroare la creare socket");
exit(3);
}

/*Asociaz socketului o adres de server */


memset(&server, 0, sizeof(server));
server.sin_family = AF_INET; /*AF_UNIX, AF_INET*/
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr("193.226.34.61"); /* adresa
Internet locala */
if ( bind ( s, &server, sizeof(server)) <0)
{
perror("Eroare la obinerea adresei");
exit(4);
}
Reele de calculatoare

/*Creeaz coad pentru cererile de conexiune; va prelua maxim


5 cereri de conexiune de la clieni, restul fiind refuzate */
if (listen(s, 5) != 0)
{
perror("Eroare la obinerea cozii de cereri");
exit(5);
}

/* Creeaz un descriptor de socket pentru. comunicaia server-


client */
namelen = sizeof(client);
if ((ns = accept( s, &client, &namelen)) == -1)
{
perror("Eroare la acceptarea conexiunii");
exit(6);
}

/* Recepioneaz mesajul de la client */


if(recv(ns, buffer, 32, 0) == -1)
{
perror ("Eroare la recepie");
exit(7);
}

/* Afieaz mesajul primit de la client */


printf("Mesaj recepionat de la client, pe TCP: %s\n", buffer);

/*Trasmite confirmarea clientului */


if (send(ns, buffer, strlen(buffer), 0) <0)
{
perror("Eroare la transmisie");
exit(8);
}

endhostent(); /* nchide sesiunea TCP/IP */


close(ns);
close(s);
exit(0);
}
Comunicaie client-server la nivel de socket

/* CLIENT TCP */

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>

main (int argc, char ** argv)


{
unsigned short port; /* portul client, acelai ca cel
specificat n modulul server */
char buffer[32];
struct sockaddr_in server; /*adres server*/
struct hostent * hostnm; /*informaii server */
int s, rc;
if (argc != 3)
{
printf("Apel: %s hostname port \n", argv[0]);
exit(1);
}

/*preia numele calculatorului local */


if (!(hostnm=(struct hostent *) gethostbyname(argv[1])))
{
perror("Eroare la preluarea numelui serverului");
exit(3);
}

printf("A preluat numele de server.... \n");

port = (unsigned short)atoi(argv[2]);


strcpy(buffer, "Mesaj transferat prin socket, pe TCP");

/*preia informaiile despre server*/


server.sin_family = AF_INET; /*AF_UNIX, AF_INET*/
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr("193.226.34.61"); /*
aceeai ca la server */
Reele de calculatoare

printf("A preluat inf. despre server....\n");

if ((s = socket(AF_INET,SOCK_STREAM,0)) < 0)


{
perror("Eroare la creare socket");
exit(4);
}

printf("A creat socket-ul....\n");


if (connect(s, &server, sizeof(server)) < 0)
{
perror("Eroare la obinerea conexiunii");
exit(5);
}

printf("A realizat conexiunea.....\n");

/* Transmite mesajul serverului */


if (send(s, buffer, strlen(buffer), 0) < 0)
{
perror("Eroare la transmisie");
exit(6);
}

printf("A transmis mesajul.....\n");

/* Confirmare de la server */
if (recv(s, buffer, 32, 0) < 0)
{
perror("Eroare la recepie");
exit(7);
}

printf("Confirmarea de la server a fost fcut.... \n");

close(s);
exit(0);
}
Comunicaie client-server la nivel de socket

2. S se construiasc o aplicaie server i una client care s comunice


prin datagrame.

/* Modul SERVER UDP */


#include <sys/types.h>
#include <sys/socket.h>

#include <stdio.h>
#include <errno.h>
#include <netdb.h>

main()
{
char buffer[32];
struct sockaddr_in client, server; /*adresele client, server*/
int s, rc, namelen;

/*Creeaz un socket*/
if ((s=socket(AF_INET, SOCK_DGRAM, 0)) <0)
{
perror("Eroare la creare socket");
exit(1);
}
printf("A creat socket-ul....\n");

/*Asociaz socketului o adres de server */


memset(&server, 0, sizeof(server));
server.sin_family = AF_INET; /*AF_UNIX, AF_INET*/
server.sin_port = 0; /* orice port */
server.sin_addr.s_addr = INADDR_ANY;
if ( bind( s, &server, sizeof(server)) <0)
{
perror("Eroare la obinerea adresei");
exit(2);
}

printf("S-a alocat o adres .....\n");

/* Determin portul asignat*/


namelen = sizeof(server);
if (getsockname(s, (struct sockaddr *) &server, &namelen))
Reele de calculatoare

{
perror("Eroare la determinarea portului");
exit(3);
}

printf("\n Portul asignat este: %d\n", ntohs(server.sin_port));

namelen = sizeof(client);

/* Recepioneaza mesajul de la client */


if (recvfrom ( s, buffer, 32, 0, &client, sizeof(client)) < 0)
{
perror ("Eroare la recepie");
exit(4);
}
printf("A recepionat mesajul de la client.... \n");

/* Afieaz mesajul primit de la client */


printf("\n Mesajul recepionat de la client este: %s\n", buffer);
printf("Parametrii: \n Nume domeniu: %s \n \Port: %d \n Adresa
\Internet: %s \n", (client.sin_family == AF_INET?
"AF_INET":"AF_UNIX"), ntohs(client.sin_port),
inet_ntoa(client.sin_addr));

endhostent (); /* nchide sesiunea UDP/IP */


close(s);
exit(0);
}

/* Modul CLIENT UDP */


/* Modul CLIENT UDP */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <errno.h>
#include <netdb.h>

main(int argc, char ** argv)


{
Comunicaie client-server la nivel de socket

unsigned short port; /* portul client,


acelai ca cel specificat n modulul server */
char buffer[32];
struct sockaddr_in server; /*adres
server*/
int s, rc;
if(argc!= 2)
{
printf("Apel: %s port \n", argv[0]);
exit(1);
}

port=(unsigned short) atoi(argv[1]);


strcpy(buffer, "Mesaj transferat prin socket, pe
UDP");

/*preia informaiile despre server*/


server.sin_family = AF_INET; /*AF_UNIX,
AF_INET*/
server.sin_port = htons(port);
server.sin_addr.s_addr =
inet_addr("193.226.34.61"); /* aceeasi ca la server */

if ((s=socket(AF_INET, SOCK_DGRAM, 0)) <0)


{
perror("Eroare la creare socket");
exit(2);
}

/* Transmite mesajul serverului */


if(sendto(s, buffer, strlen(buffer)+1, 0, &server,
sizeof(server)) < 0)
{
perror ("Eroare la transmisie");
exit(3);
}

close(s);
exit(0);
}
Reele de calculatoare

3. S se construiasc o aplicaie de tip server stream (TCP) concurent,


care ateapt un numr N de la un client i returneaz lista numerelor
prime mai mici dect N.

Rezolvarea servirii concurente a mai multor clieni se va face


folosind apelul fork(). Se creaz astfel un proces copil care va servi un
anumit client.

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <error.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>

/* portul folosit */
const int PORT_SERVER = 9001;
/* numarul maxim de clieni acceptai */
const int CLIENTI_MAXIM = 10;

extern int errno; /* eroarea returnat */


int ds; /* descriptor pentru server */
int dc; /* descriptor pentru client */
int nr = 0; /* numrul de clieni */

void semnal (int nr_semnal) /* funcia de tratare a semnalelor */


{
if (nr_semnal == SIGCHLD)
{
wait (NULL);
nr--; /* am pierdut un client */
return;
}
}
/* ntoarce 0 dac nu e prim, i altfel */
int e_prim (int i)
{
int k;
Comunicaie client-server la nivel de socket

for (k = 2; k * k <= i; k++)


if ((i%k) == 0)
return 0;
return 1;
}
void client () /* funcia de tratare a clientului */
{
char buffer[100];
char aux[100];
int i,t;
int numar, k;
sprintf (aux,"Eti clientul numrul: %d\n",nr);
if (write (dc, aux, strlen (aux))!=strlen (aux))
{
shutdown (dc, 2); /* eroare, am ieit */
exit (errno);
}
sprintf (aux, "Dai numrul:");
if (write (dc, aux, strlen (aux))!=strlen (aux))
{
shutdown (dc, 2);
exit (errno);
}
bzero (buffer, 100);
/* citete numarul sub forma de ir de caractere */
if (read (dc, buffer, 100) == 0)
{
shutdown (dc, 2);
exit (errno);
}
/* din ir de caractere n ntreg */
numr = atoi (buffer);
for (k = 2; k < numr; k++)
if (e_prim (k))
{
sprintf (aux, "Numr prim: %d\n", k);
if (write (dc, aux, strlen (aux))!=strlen (aux))
{
shutdown (dc, 2);
exit (errno);
}
Reele de calculatoare

}
shutdown (dc, 2);
exit (errno);
}
/* programul principal */
int main ()
{
struct sockaddr_in server;
/* tratm semnalele */
if (signal (SIGCHLD, semnal) == SIG_ERR)
{
perror ("signal()") ;
exit (errno);
}
if (signal (SIGPIPE, SIG_IGN) == SIG_ERR)
{
perror ("signal()");
exit (errno);
}
/* crem socket-ul */
if ((ds = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("socket() ") ;
return errno;
}
/* pregtim structurile de date */
bzero (&server, sizeof (server));
server.sin_family = AF_INET;
server.sin_port = htons (PORT_SERVER);
server.sin.addr.s_addr = htonl (INADDR_ANY);
/* atam la port */
if (bind (ds, &server, sizeof (server)) == -1)
{
perror ("bind()");
return errno;
}
if (listen (ds, 5) == -1)
{
perror ("listen() ") ;
return errno;
}
Comunicaie client-server la nivel de socket

printf ("Ateptm clieni la portul %d...\n", PORT_SERVER) ;


while (1)
{
/* acceptm un client */
dc = accept (ds, NULL, NULL);
/* am ajuns la numrul maxim de clieni? */
if (nr == CLIENTI_MAXIM)
{
shutdown (dc, 2) ;
continue;
}
/* lansm un proces care trateaz cererile clientului */
switch (fork ())
{ case 0:
client ();
case -1:
perror ("fork()");
break;
default:
break;
}
nr++; /* a mai venit un client */
}
}
7 Implementarea aplicaiilor distribuite
pe platformele .NET i J2EE

Aplicaiile economice vehiculeaz un volum mare de date care


trebuie prelucrate n vedere obinerii de informaii necesare pentru
fundamentarea procesului decizional. Globalizarea la nivel microeconomic a
activitii a transformat treptat modelul de prelucare client-server specific
primelor aplicaii de reea, ntr-un model bazat pe niveluri de servicii, cel mai
simplu incluznd nivelul de acces la date, nivelul logicii aplicaiei i nivelul
de prezentare prin care aplicaia este accesat de ctre utilizatori.

.NET este soluia propus de Microsoft pentru programarea


aplicaiilor distribuite n Internet, fiind identificat prin urmtoarele trei
componente eseniale:
un mediu de execuie independent de limbaj optimizat pentru
prelucrri distribuite .NET Framework;
un mediu de dezvoltare care ofer suport pentru mai multe
limbaje de programare standardizate sau proprietate Microsoft
Visual Studio .NET;
sistemul de operare care ofer suport pentru aplicaiile distribuite
dezvoltate pe platforma .NET Framework Windows Server.
Viziunea care a stat la baza iniiativei .NET a avut n vedere
asigurarea urmtoarelor deziderate:
programarea independent de limbaj;
robusteea i scalabilitatea aplicaiilor pe ansamblu;
securitatea integrat;
uurina implementrii;
distribuirea prelucrrilor;
suportul pentru standarde deschise;
mentenabilitatea;
faciliti de depanare avansate.
.NET este similar platformei J2EE; ambele constituie o abordare
structurat pentru crearea aplicaiilor distribuite, oferind limbaje compilate n
cod intermediar mpreun cu o bogat colecie de interfee de programare
pentru dezvoltarea aplicaiilor. Intenia platformei Java a fost s ofere suport
pentru aplicaiile scrise n limbajul Java i compilate n cod de octei Java.
Chiar dac au existat ncercri de a porta i alte limbaje pe platforma JVM,
ele au rmas doar n sfera limbajelor formale, Jython fiind doar un exemplu
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

didactic de portare a limbajului de scripting Python pe JVM, i asta pentru c


ideea platformei Java a fost mereu una simpl i eficient: un singur limbaj
care s ruleze pe mai multe sisteme de operare. Spre deosebire de J2EE,
platforma .NET ofer suport pentru mai multe limbaje de programare
compilate n Microsoft Intermediate Language (MSIL), plecnd de la ideea:
o singur platform pe care pot rula mai multe limbaje.

Firma Sun Microsystems a dezvoltat Java att ca limbaj, ct i


platform pentru dezvoltarea aplicaiilor distribuite, existnd n prezent trei
ediii ale platformei Java:
J2SE (Java 2 Standard Edition), pentru programarea de platform
i n reea;
J2EE (Java 2 Enterprise Edition), pentru aplicaii de ntreprindere;
J2ME (Java 2 Micro Edition), pentru dispozitive mobile.
Spre deosebire de .NET, J2EE este un set de specificaii standardizate
i nu un produs, permind dezvoltatorilor s creeze aplicaii distribuite pe
mai multe niveluri. Diferenele fundamentale ntre J2EE i .NET se
concretizeaz n:
suportul pentru sisteme de operare;
suportul pentru limbajele de programare;
metoda de execuie.
nc de la nceput Java a fost proiectat s lucreze cu un numr mare
de sisteme de operare, rulnd n prezent pe platforme: Windows, UNIX,
Linux, MacOS, BeOS.
Spre deosebire de J2EE, .NET a fost gndit s ruleze doar pe
Windows, existnd ns ncercri de portare a mediului de execuie i pe
Linux, proiectele de tip Open Source, precum Mono i Rotor oferind suport
pentru majoritatea interfeelor de programare din .NET.

Pentru implementarea aplicaiilor distribuite este nevoie de servere de


aplicaii pentru publicarea componentelor care nglobeaz logica aplicaiei.
Paltforma .NET ofer IIS cu ASP.NET prin intermediul cruia se
pot publica i executa servicii Web scrise n limbaje compilabile
pe CRL (Common Language Runtime) n MSIL (Microsoft
Intermediate Language), cum sunt C#, J#, C++ Managed, Pascal
(Delphi), Visual Basic .NET, Perl etc., sau chiar Java prin IkVm
i Mono;
Platforma J2EE dispune att de implementri comerciale, precum
WebLogic de la BEA, WebSphere Application Server de la IBM,
iPlanet i SunONE Application Server de la Sun, Enterprise
Reele de calculatoare

Server de la Borland etc., precum i de implementri Open Source


cum sunt JBoss sau JOnAs. Acestea sunt servere de componente
EJB (Enterprise Java Beans), care, pentru a putea gzdui servicii
Web, necesit, ca i IIS-ul, un mediu de procesare a mesajelor
SOAP i de gestiune a componentelor de serviciu. n J2EE exist
mai multe implementri SOAP, precum Axis i SOAP de la
Apache, Web Services Developement Kit (WSDK) de la Sun i
omonimul su de la IBM, sau Glue, iniial dezvoltat de The
Mind Electric, actualmente oferit de WebMethods.

Pentru accesul la date, aplicaiile distribuite fac apel la servere de


baze de date relaionale, prin interfee de programare specifice.
Platform .NET ofer ActiveX Database Objects .NET
(ADO.NET), prin intermediul creia se poate conecta la server
Microsoft precum SQL Server 2000 (sau Yukon n curnd),
MSDE, Access, dar i la Oracle Database Server, IBM DB2,
precum i la MySQL sau PostGre SQL.
Platforma J2EE dispune de Java Database Connectivity (JDBC),
o interfa de programare pentru care exist drivere de conectare
la aproape orice baz de date relaional sau sistem de fiiere,
incluznd Oracle Database Server, IBM DB2, Sybase, MS SQL
Server 2000, MSDE, MS Access, MySQL, PostGre SQL etc.

Pentru clieni Web este nevoie de servere Web cu suport dedicat


tehnologiilor specifice, astfel:
Platforma .NET ofer ASP.NET, o tehnologie dezvoltat din ASP
n sensul separrii procesrilor pe server de formatarea HTML a
rezultatului, permind o mai bun ncapsulare a codului n
executabile binare interpretabile pe CLR. Necesit IIS cu modul
ISAPI ASPNET.dll sau Apache cu modul dedicat ASP.NET.
Platforma J2EE ofer dou tehnologii: servlet i JSP, crora li s-a
adugat recent JSF (Java Server Faces), o tehnologie echivalent
cu ASP.NET. Se execut att pe servere Web, cele mai folosite
fiind Tomcat, Orion sau Jetty, ct i pe servere de aplicaii J2EE
amintite la nivelul logicii aplicaiei.
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

7.1 Nivelul de acces la date

7.1.1 Apelarea procedurilor stocate pe SQL Server


Microsoft SQL Server 2000 reduce vizibil timpul necesar pentru a
construi soluii bazate pe Web, de afaceri i de depozitare a datelor,
automatiznd n acelai timp sarcinile de gestionare i adaptare. SQL Server
2000 este optimizat pentru a fi folosit cu Windows 2000 i este proiectat
pentru a crete o dat cu afacerea dumneavoastr. Caracteristicile pentru a
aduce pe Web aplicaiile noi i existente sunt incluse cu suport XML i acces
HTTP. Alte caracteristici includ capacitatea de cutare de text n bazele de
date i formate de documente cunoscute; auto-gestionare i adaptare
dinamic, servicii de analiz integrate i migrarea i transformarea
simplificat a datelor. Procedurile stocate sunt o colecie de declaraii
precompilate stocate sub un nume i procesate ca o unitate. Procedurile
stocate sunt disponibile pentru administrarea SQL Server i afiarea
informaiilor despre baze de date i utilizatori. Procedurile stocate instalate o
dat cu SQL Server se numesc proceduri stocate de sistem. Cnd se creeaz o
aplicaie cu SQL Server, limbajul de programare Transact-SQL (TSQL) este
interfaa primar de programare ntre aplicaie i baza de date SQL Server.
Manipularea i execuia procedurilor stocate se poate realiza n dou moduri:
prin stocarea local a programelor i crearea aplicaiilor care s
trimit comezile ctre SQL Server i s proceseze rezultatele;
prin stocarea programelor ca proceduri stocate n SQL Server i
crearea aplicaiilor care s execute aceste proceduri i s
proceseze rezultatele.
Procedurile stocate din SQL Server sunt similare procedurilor din alte
limbaje deoarece pot s:
primeasc parametri introdui i s returneze valori multiple sub
forma parametrilor de ieire;
conin declaraii care s ndeplineasc operaiuni n baza de date,
inclusiv s cheme alte proceduri.
Se poate folosi declaraia EXECUTE pentru a rula o procedur
stocat. Procedurile stocate sunt diferite de funcii deoarece nu pot returna
valori n locul numelui lor i nu pot fi folosite direct ntr-o expresie.
Avantajele folosirii procedurilor stocate n SQL Server n locul programelor
Transact-SQL stocate local n sistemele client sunt:
permit programarea modular: procedura poate fi creat doar o
singur dat, stocat n baza de date i chemat ori de cte ori este
nevoie n program. Procedurile stocate pot fi create de o persoan
Reele de calculatoare

specializat n programarea bazelor de date i pot fi modificate


independent de codul surs al programului care le folosete;
permit rularea mai rapid: dac operaiunea cere o cantitate mare
de cod Transact-SQL sau este rulat n mod repetat, procedurile
stocate pot fi mai rapide dect codul Transact-SQL de la client.
Ele sunt analizate i optimizate n momentul crerii lor i
versiunea in-memory a procedurii poate fi folosit dup ce este
executat pentru prima dat;
permit reducerea traficului pe reea: o operaiune care cere sute de
linii de cod Transact-SQL poate fi executat printr-o singur
declaraie care execut codul n cadrul unei proceduri, dect s se
trimit sute de linii de cod pe reea.
Pentru apelarea unei proceduri stocate, clientul ADO.NET pentru
SQL Server ofer obiectul SqlCommand pentru care se seteaz proprietatea
CommandType la valoarea StoredProcedure, respectiv CommandText ca fiind
numele procedurii stocate din spaiul rolului conexiunii deschise, astfel:
this.sqlCommand = new SqlCommand();
this.sqlCommand.CommandText = "dbo.[getProducts]";
this.sqlCommand.CommandType = CommandType.StoredProcedure;
this.sqlCommand.Connection = this.sqlConnection;
this.sqlCommand.Parameters.Add(new
SqlParameter("@RETURN_VALUE", SqlDbType.Int, 4,
ParameterDirection.ReturnValue, false, ((byte)(0)),
((byte)(0)), "", DataRowVersion.Current, null));
n cazul unei proceduri stocate care selecteaz date din mai multe
tabele prin intermediul unui adapter trebuie mapate coleciile
extrase din baz peste tabelele DataSet-ului destinaie:
this.sqlDataAdapter.SelectCommand = this.sqlCommand;
this.sqlDataAdapter.TableMappings.Add("data", "Categories");
this.sqlDataAdapter.TableMappings.Add("data1", "Producers");
this.sqlDataAdapter.TableMappings.Add("data2", "Products");
this.sqlDataAdapter.TableMappings.Add("data3", "Stock");
procedura stocat selecteaz datele astfel:
CREATE PROCEDURE dbo.getProducts
AS
SELECT * FROM Categories;
SELECT * FROM Producers;
SELECT * FROM Products;
SELECT * FROM Stock;
RETURN
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

apelul seleciei datelor cu ajutorul adapter-ului presupune


denumirea tabelei origine ale crei mapri duc datele n tabele ale
DataSet-ului:

DataSet dataSet = new DataSet();


this.sqlDataAdapter.Fill(dataSet, "data");

JDBC ofer obiectul CallableStatement prin intermediul cruia se


pot apela proceduri stocate.

Obiecte Java

package tutorials.database.storedprocedure;
import java.io.Serializable;
public class Group implements Serializable {
public int GroupId;
public String Name;
public short Version;
}

package tutorials.database.storedprocedure;
import java.io.Serializable;
public class Student implements Serializable {
public int StudentId;
public String FirstName;
public String LastName;
public short Version;
}

Accesor

package tutorials.database.storedprocedure;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
public class DataAccessor {
private Connection connection;
public void open(String host, int port, String database,
String user, String password) throws SQLException,
ClassNotFoundException {
Class.ForName("com.microsoft.jdbc.sqlserver.SQLServerDri
ver");
this.connection = DriverManager.getConnection(
Reele de calculatoare

"jdbc:microsoft:sqlserver://" + host + ":" + port


+ ";DatabaseName=" + database + ";User="+ user +
";Password=" + password + ";");
}
public void close() throws SQLException {
this.connection.close();
}
public Group[] getGroups() throws SQLException {
Vector vector = new Vector();
CallableStatement statement =
this.connection.prepareCall("call
GetGroups()");
ResultSet results = statement.executeQuery();
while(results != null && results.next()) {
Group group = new Group();
group.GroupId = results.getInt(1);
group.Name = results.getString(2);
group.Version = results.getShort(3);
}
return (Group[]) vector.toArray();
}
public Student[] getStudentsByGroup(int groupId)
throws SQLException {
CallableStatement statement =
this.connection.prepareCall("call
GetStudentsByGroup(?)");
statement.setInt(1, groupId);
Vector vector = new Vector();
ResultSet results = statement.executeQuery();
while(results != null && results.next()) {
Student student = new Student();
student.StudentId = results.getInt(1);
student.FirstName = results.getString(2);
student.LastName = results.getString(3);
student.Version = results.getShort(4);
vector.add(student);
}
return (Student[]) vector.toArray();
}
}

7.1.2 Virtualizarea accesului la baza de date

Platforma .NET permite accesul la baze de date prin interfaa ADO.NET,


oferind mecanisme de acces bazate pe conexiune activ sau deconectate. n
privina suportului nativ pentru conectarea la diferite servere, platforma
.NET ofer suport pentru SQL Server chiar de la versiunea 1.0 cruia i s-a
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

adugat suportul pentru Oracle n versiunea 1.1, restul serverelor fiind


suportate prin intermediul provider-ilor oferii de diferite organizaii. Spre
exemplu, pentru accesul la MySQL exist mai muli provider-i comerciali ct
i Open Source, cel mai cunoscut fiind ByteFX. Dac n cazul punii JDBC
difer doar protocolul de conectare n funcie de server, restul metodelor
fiind comune, pe platforma .NET clasele de acces la date se gsesc n
pachete diferite i au tipuri diferite, ceea ce face imposibil legarea direct la
metodele acestora. Prin intermediul signaturii comune a metodelor interfeei
ADO.NET pe care fiecare clas de acces o implementeaz, este totui
posibil definirea unei interfee de acces la date, ce urmeaz a avea
implementri specifice fiecrui provider, implementri care fac apel la
pachetele i clasele provider-ului respectiv. Pentru ca aceeai aplicaie s se
poat conecta la mai multe servere de baze de date este necesar virtualizarea
accesului la baza de date prin implementarea unui mecanism de fabric de
obiecte care s asigure legarea implementrii specifice bazei de date utilizate.

se definete o interfa peste ADO.NET care reunete funcii


pentru operaiile cu baza de date; este necesar definirea unei
interfee deoarece clasele oferite de ctre provider-ii ADO.NET
au signaturi de pachete diferite, ceea ce face imposibil
instanierea lor pentru acelai tip de baz:

namespace Tutorials.Database
{
internal interface IDatabaseConnection
{
void Open(string host, string database, string
user, string password);
System.Data.DataSet ExecuteQuery(string statement,
string table);
object ExecuteScalar(string statement);
int ExecuteNonQuery(string statement);
void Close();
string Provider
{
get;
}
string Database
{
get;
}
}
}
Reele de calculatoare

se implementeaz interfaa pentru fiecare server de baze de date


utiliznd clasele provider-ului ADO.NET specific:

Clas de acces la SQL Server 2000

namespace Tutorials.Database
{
internal class SQLServerDatabaseConnection:
IDatabaseConnection
{
private System.Data.SqlClient.SqlConnection
connection;
private string database;
public SQLServerDatabaseConnection()
{
}
public void Open(string host, string database,
string user, string password)
{
this.connection = new
System.Data.SqlClient.SqlConnection("data source = " + host +
"; database = " + database + "; user id = " + user + ";
password = " + password);
this.connection.Open();
}
public System.Data.DataSet ExecuteQuery(string
statement, string table)
{
System.Data.DataSet dataSet = new
System.Data.DataSet();
new
System.Data.SqlClient.SqlDataAdapter(statement,
this.connection).Fill(dataSet, table);
return dataSet;
}
public object ExecuteScalar(string statement)
{
return new
System.Data.SqlClient.SqlCommand(statement,
this.connection).ExecuteScalar();
}
public int ExecuteNonQuery(string statement)
{
return new
System.Data.SqlClient.SqlCommand(statement,
this.connection).ExecuteNonQuery();
}
public void Close()
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

{
if(this.connection!=null)
this.connection.Close();
}
public string Provider
{
get
{
return "SQLServer";
}
}
public string Database
{
get
{
return this.database;
}
}
}
}

Clas de acces la Oracle

namespace Tutorials.Database
{
internal class OracleDatabaseConnection:
IDatabaseConnection
{
private System.Data.OracleClient.OracleConnection
connection;
private string database;
public OracleDatabaseConnection()
{
}
public void Open(string host, string database,
string user, string password)
{
this.connection = new
System.Data.OracleClient.OracleConnection("data source = " +
host + "; database = " + database + "; user id = " + user + ";
password = " + password);
this.connection.Open();
}
public System.Data.DataSet ExecuteQuery(string
statement, string table)
{
System.Data.DataSet dataSet=new
System.Data.DataSet();
Reele de calculatoare

new
System.Data.OracleClient.OracleDataAdapter(statement,
this.connection).Fill(dataSet, table);
return dataSet;
}
public object ExecuteScalar(string statement)
{
return new
System.Data.OracleClient.OracleCommand(statement,
this.connection).ExecuteScalar();
}
public int ExecuteNonQuery(string statement)
{
return new
System.Data.OracleClient.OracleCommand(statement,
this.connection).ExecuteNonQuery();
}
public void Close()
{
if(this.connection!=null)
this.connection.Close();
}
public string Provider
{
get
{
return "Oracle";
}
}
public string Database
{
get
{
return this.database;
}
}
}
}

Clas de access la MySQL

namespace Tutorials.Database
{
internal class MySQLDatabaseConnection:
IDatabaseConnection
{
private ByteFX.Data.MySqlClient.MySqlConnection
connection;
private string database;
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

public MySQLDatabaseConnection()
{
}
public void Open(string host, string database,
string user, string password)
{
this.database = database;
this.connection = new
ByteFX.Data.MySqlClient.MySqlConnection(" data source =
"+host+";database = "+database+";user id = "+user+";password =
"+password);
this.connection.Open();
}
public System.Data.DataSet ExecuteQuery(string
statement,string table)
{
System.Data.DataSet dataSet=new
System.Data.DataSet();
new
ByteFX.Data.MySqlClient.MySqlDataAdapter(statement,this.connec
tion).Fill(dataSet, table);
return dataSet;
}
public object ExecuteScalar(string statement)
{
return new
ByteFX.Data.MySqlClient.MySqlCommand(statement,
this.connection).ExecuteScalar();
}
public int ExecuteNonQuery(string statement)
{
return new
ByteFX.Data.MySqlClient.MySqlCommand(statement,
this.connection).ExecuteNonQuery();
}
public void Close()
{
if(this.connection != null)
this.connection.Close();
}
public string Provider
{
get
{
return "MySQL";
}
}
public string Database
{
get
Reele de calculatoare

{
return this.database;
}
}
}
}

se construiete o clas fabric de obiecte care instaniaz


implementarea interfeei de acces la baza de date specific unui
anumit server:

Clas fabric de conexiune la o anumit baz de date

using System;
namespace Tutorials.Database
{
public enum Providers{Oracle, SqlServer, MySql}
public class DatabaseConnection
{
private IDatabaseConnection databaseConnection =
null;
public void Open(Providers provider, string host,
string database, string user, string password)
{
switch(provider)
{
case Providers.Oracle:
this.databaseConnection = new
OracleDatabaseConnection();
break;
case Providers.SqlServer:
this.databaseConnection = new
SQLServerDatabaseConnection();
break;
case Providers.MySql:
this.databaseConnection = new
MySQLDatabaseConnection();
default:
this.databaseConnection = null;
break;
}
if(this.databaseConnection != null)
this.databaseConnection.Open(host, database, user,
password);
}
public System.Data.DataSet ExecuteQuery(string
statement, string table)
{
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

return this.databaseConnection != null ?


this.databaseConnection.ExecuteQuery(statement, table) : null;
}
public object ExecuteScalar(string statement)
{
return this.databaseConnection != null ?
this.databaseConnection.ExecuteScalar(statement) : null;
}
public int ExecuteNonQuery(string statement)
{
return this.databaseConnection != null ?
this.databaseConnection.ExecuteNonQuery(statement) : -1;
}
public void Close()
{
if(this.databaseConnection != null)
{
this.databaseConnection.Close();
this.databaseConnection = null;
}
}
public string Provider
{
get
{
return this.databaseConnection != null
? this.databaseConnection.Provider : null;
}
}
public bool IsOpened
{
get
{
return this.databaseConnection !=
null;
}
}
}
}

Spre deosebire de soluia ADO.NET n care fiecare provider ofer


drivere avnd signaturi de pachet diferite i deci incompatibile ca tip de dat,
JDBC ofer o interfa unitar de acces, ceea ce faciliteaz implementarea
unei clase unice de acces la diferite baze de date. Totui, crearea unei
conexiuni este specific fiecrui provider prin driverul i protocolul de acces
aferente, ceea ce impune definirea unei clase abstracte avnd o singur
metod abstract care creeaz o conexiune la baza de date, restul metodelor
apelnd interfaa JDBC.
Reele de calculatoare

se definete o clas abstract care va conine metoda abstract de


conectare i implementarea comun a metodelor de acces la date,
de forma:

public abstract class DatabaseConnection {


protected String host;
protected int port;
protected String database;
protected String user;
protected String password;
protected java.sql.Connection connection;
public abstract void connect(String host, int port,
String database, String user, String password)
throws java.lang.ClassNotFoundException,
java.sql.SQLException;
public void close()throws java.sql.SQLException {
this.connection.close();
}
public java.sql.ResultSet executeQuery(String statement)
throws java.sql.SQLException {
return(this.connection.createStatement()).executeQuery(s
tatement);
}
public boolean executeInsert(String statement)
throws java.sql.SQLException {
return(this.connection.createStatement()).execute(statem
ent);
}
public boolean executeUpdate(String statement)
throws java.sql.SQLException {
return(this.connection.createStatement()).execute(statem
ent);
}
public boolean executeDelete(String statement)
throws java.sql.SQLException {
return(this.connection.createStatement()).execute(statem
ent);
}
}

pentru conectarea la un anumit server se extinde clasa abstract


prin implementarea metodei de conectare; spre exemplu, pentru
conectarea la MySQL, clasa derivat va arta astfel:

public class MySQLDatabaseConnection extends


DatabaseConnection {
public MySQLDatabaseConnection() {
}
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

public void connect(String host, int port,


String database, String user, String password)
trows java.lang.ClassNotFoundException,
java.sql.SQLException {
this.host = host;
this.port = port;
this.database = database;
this.user = user;
this.password = password;
Class.forName("org.gjt.mm.mysql.Driver");
this.connection =
java.sql.DriverManager.getConnection("jdbc:mysql://" +
this.host + ":" + this.port + "/" + this.database + "?user=" +
this.user + "&password=" + this.password);
}
}

pentru conectarea la SQL Server clasa derivat va arta astfel:

public class SQLServerDatabaseConnection extends


DatabaseConnection
{
public SQLServerDatabaseConnection() {
}
public void connect(String host, int port,
String database, String user, String password)
throws
java.lang.ClassNotFoundException,java.sql.SQLException {
this.host = host;
this.port = port;
this.database = database;
this.user = user;
this.password = password;
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDri
ver");
this.connection =
java.sql.DriverManager.getConnection("jdbc:microsoft:sqlserver
://" + this.host+ ":" + this.port + ";DatabaseName=" +
this.database + ";User=" + this.user + ";Password=" +
this.password + ";");
}
}

n ambele cazuri metoda de conectare face apel la clasele punii


JDBC pentru serverul de baze de date respectiv, astfel nct
pentru deschiderea conexiunii prin JDBC este necesar plasarea
claselor de acces n CLASSPATH.
Reele de calculatoare

7.2 Nivelul logicii aplicaiei

7.2.1 Apelarea procedurilor la distan

Publicarea i apelarea unui obiect prin .NET Remoting presupune


urmtoarele aciuni:
se definete interfaa i obiectele de serviciu ntr-un assembly
partajat ntre server i client, de forma:

Obiect de serviciu

using System;
namespace Tutorials.Remoting.Common
{
[Serializable]
public class Customer
{
public string FirstName;
public string LastName;
public DateTime DateOfBirth;
}
}

Interfa serviciu

namespace Tutorials.Remoting.Common
{
public interface ICustomerManager
{
Customer[] GetCustomers();
}
}

se construiete un proiect n care se implementeaz interfaa de


apel:

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using Tutorials.Remoting.Common;
namespace Tutorials.Remoting.Service
{
public class CustomerManager : MarshalByRefObject,
ICustomerManager
{
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

public CustomerManager()
{

Console.WriteLine("CustomerManager.constructor: Object
created");
}

public Customer[] GetCustomers()


{
Customer[] customers = new Customer[2];
customers[0] = new Customer();
customers[0].FirstName = "Iulian";
customers[0].LastName = "Nemedi";
customers[0].DateOfBirth = new
DateTime(1979, 7, 24);
customers[1] = new Customer();
customers[1].FirstName = "Dan";
customers[1].LastName = "Cuculescu";
customers[1].DateOfBirth = new
DateTime(1979, 1, 1);
return customers;
}
}
}

pentru publicarea serviciului se poate opta pentru un context Web


pe IIS, un serviciu de platform sau o aplicaiei consol de test:

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
using Tutorials.Remoting.Service;
namespace Tutorials.Remoting.Server
{
class Server
{
[STAThread]
static void Main(string[] args)
{
HttpChannel channel = new HttpChannel(1979);
ChannelServices.RegisterChannel(channel);

RemotingConfiguration.RegisterWellKnownServiceType(
typeof(CustomerManager),
"CustomerManager.soap",
WellKnownObjectMode.Singleton);
Console.ReadLine();
}
Reele de calculatoare

}
}

clientul obine o referin la obiectul la distan apelnd


activatorul canalului HTTP la serverul de obiecte, prin
intermediul crei apeleaz metodele obiectului:

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels.Http;
using System.Runtime.Remoting.Channels;
using Tutorials.Remoting.Common;
namespace Tutorials.Remoting.Client
{
class Client
{
[STAThread]
static void Main(string[] args)
{
HttpChannel channel = new HttpChannel();
ChannelServices.RegisterChannel(channel);
ICustomerManager manager =
(ICustomerManager) Activator.GetObject(
typeof(ICustomerManager),

"http://localhost:1979/CustomerManager.soap");
Console.WriteLine("Client.Main(): Reference
to CustomerManager acquired");
Customer[] customers =
manager.GetCustomers();
foreach(Customer customer in customers)
Console.WriteLine("Customer:\n" +
"First Name:\t" +
customer.FirstName + "\n" +
"Last Name:\t" +
customer.LastName + "\n" +
"Day of Birth:\t" +
customer.DateOfBirth.ToString("dd\\.MM\\.yyyy") + "\n");
}
}
}
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

Arhitectura Java pentru apelarea procedurilor la distan prin RMI


(Remote Method Invocation):

Interfa de metode apelabile la distan

package tutorials.remoting;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface IPrimeNumbers extends Remote {
public int[] getPrimeNumbers(int n)
throws RemoteException;
}

Implementarea interfeei de metode apelabile la distan

package tutorials.remoting;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class PrimeNumbers extends UnicastRemoteObject
implements IPrimeNumbers {
public PrimeNumbers()
throws RemoteException {
super();
}
public int[] getPrimeNumbers(int n)
throws RemoteException {
boolean[] isNotPrime = new boolean[n + 1];
int found = 0;
for(int i = 2; i <= n - 1; i++)
if(isNotPrime[i] == false)
{
found++;
for(int j = 2; j * i <= n; j++)
isNotPrime[j * i] = true;
}
int[] numbers = new int[found];
int k = 0;
for(int i = 2; i <= n; i++)
if(isNotPrime[i] == false)
numbers[k++] = i;
return numbers;
}
}
Reele de calculatoare

Server pentru obiectul ale crui metode sunt apelabile la distan

package tutorials.remoting;
import java.rmi.Naming;
import java.rmi.RMISecurityManager;
public class Server {
public static void main(String[] args) {
System.setSecurityManager(new
RMISecurityManager());
try {
PrimeNumbers primeNumbers = new
PrimeNumbers();
Naming.rebind("//remoting/PrimeNumbersServer",
primeNumbers);
}
catch(Exception exception) {
System.out.println(exception.toString());
}
}
}

Client care apeleaz metode ale unui obiect la distan

package tutorials.remoting;
import java.rmi.Naming;
public class Client {
public static void main(String[] args) {
try {
PrimeNumbers primeNumbers = (PrimeNumbers)
Naming.lookup("rmi://remoting/PrimeNumbersService");
int n = args.length == 1 ?
Integer.parseInt(args[0]) : 1000;
int[] numbers =
primeNumbers.getPrimeNumbers(n);
String message = "";
for(int i = 0; i < numbers.length; i++)
message += (message.length() > 0 ? ",
" : "") + numbers[i];
System.out.println(message);
}
catch(Exception exception) {
System.out.println(exception.toString());
}
}
}
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

7.2.2 Serializarea tipurilor de date complexe

pentru transportul tipurilor de date complexe este necesar


serializarea / deserializarea lor XML; mecanismul poate fi
implementat declarativ prin intermediul atributelor sau imperativ
prin instruciuni care apeleaz un obiect de tipul XmlWriter,
respectiv XmlReader:

Clas C# serializat XML n mod declarativ

using System;
using System.Xml.Serialization;
namespace Tutorials.ComplexTypeServices.Service
{
[XmlRoot(Namespace = "http://aris.ase.ro/schemas")]
public class Contact
{
[XmlElement("FirstName")]
public string FirstName;
[XmlElement("LastName")]
public string LastName;
[XmlElement("Email")]
public string Email;
}
}

Clas Java serializat XML n mod declarativ

package tutorials.services.complextype;
import java.io.Serializable;
public class Contact implements Serializable
{
public String FirstName;
public String LastName;
public String Email;
}

serviciul expune o metod care ntoarce un vector de obiecte


serializate XML:

Serviciu C#

using System;
using System.Collections;
using System.ComponentModel;
Reele de calculatoare

using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
namespace Tutorials.ComplexTypeServices.Service
{
[WebService(Namespace = "http://aris.ase.ro/schemas")]
public class ContactService :
System.Web.Services.WebService
{
public ContactService()
{
InitializeComponent();
}
#region Component Designer generated code
private IContainer components = null;
private void InitializeComponent()
{
}
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
[WebMethod]
public Contact[] GetContacts()
{
Contact[] contacts = new Contact[2];
contacts[0] = new Contact();
contacts[0].FirstName = "Iulian";
contacts[0].LastName = "Ilie-Nemedi";
contacts[0].Email = "iulian.nemedi@ase.ro";
contacts[1] = new Contact();
contacts[1].FirstName = "Radu";
contacts[1].LastName = "Constantinescu";
contacts[1].Email =
"radu.constantinescu@ase.ro";
return contacts;
}
}
}

ntr-un proiect Java dezvoltat cu ajutorul mediului Eclipse, se


copiaz structura unei aplicaii Glue generate cu ajutorul
utilitarului NewApp (copiat de fapt din Glue/app-template); se
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

precizeaz c binarele aplicaiei vor fi depuse n calea WEB-


INF/classes;
se organizeaz clasele ntr-un director surs, respectiv ntr-un
pachet Java n care se definete un tip complex care va fi ntors de
metodele serviciului Web; pentru a putea fi serializat XML acesta
trebuie s implementeze interfaa java.io.Serializable;
se definete interfaa serviciului Web:

Interfaa serviciului Java

package tutorials.services.complextype;
public interface IContactService {
public Contact[] getContacts();
}

se implementeaz interfaa prin intermediul clasei serviciului; n


producie metodele serviciului fac apel la o baz de date pentru
extragerea informaiilor:

Serviciu Java

package tutorials.services.complextype;
public class ContactService implements IContactService {
public Contact[] getContacts() {
Contact[] contacts = new Contact[2];
contacts[0] = new Contact();
contacts[0].FirstName = "Iulian";
contacts[0].LastName = "Ilie-Nemedi";
contacts[0].Email = "iulian.nemedi@ase.ro";
contacts[1] = new Contact();
contacts[1].FirstName = "Radu";
contacts[1].LastName = "Constantinescu";
contacts[1].Email = "radu.constantinescu@ase.ro";
return contacts;
}
}

clientul .NET apeleaz serviciul prin intermediul unui proxy care


conine clase pentru deserializarea obiectelor complexe pe baza
schemei XSD extras din descriptorul WSDL al serviciului:
Client C#
using System;
namespace Tutorials.ComplexTypeServices.ClientForNetService
Reele de calculatoare

{
class Client
{
[STAThread]
static void Main(string[] args)
{
ContactProxy.Contact[] contacts = new
ContactProxy.ContactService().GetContacts();
for(int i = 0; i < contacts.Length; i++)
Console.WriteLine("Contact:\n" +
"\tFirst Name: " + contacts[i].FirstName +
"\n" +
"\tLast Name: " + contacts[i].LastName +
"\n" +
"\tEmail: " + contacts[i].Email + "\n");
}
}
}
clientul Java are nevoie de o clas pentru reprezentarea obiectului
complex deserializat; pentru construirea acesteia platforma Glue
Professional ofer utilitarul schema2java;
apelarea din Java presupune importarea pachetelui cu definirea
tipului de date complex i a interfeei serviciu; clasa proxy se
obine prin apelul metodei statice
electric.revistry.Registry.bind:

Client Java

package tutorials.services.complextype;
import electric.registry.Registry;
import electric.registry.RegistryException;
public class Client {
public static void main(String[] args)
throws RegistryException {
IContactService proxy = (IContactService)
Registry.bind(args[0], IContactService.class);
Contact[] contacts = proxy.getContacts();
for(int i = 0; i < contacts.length; i++)
System.out.println("Contact:\n" +
"\tFirst Name: " + contacts[i].FirstName +
"\n" +
"\tLast Name: " + contacts[i].LastName +
"\n" +
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

"\tEmail: " + contacts[i].Email + "\n");


}
}

existena unor tipuri de date elementare echivalente face posibil


serializarea pe o platform i deserializarea pe alta a tipurilor de
date complexe; chiar i n absena mecanismelor de serializare /
deserializare ale containerelor de servicii Web, portabilitatea unui
singur tip elementar, de exemplu String, permite traversarea
platformei de ctre un obiect complex, n ultim instan
programatorul putnd folosi serializarea i deserializarea String
a obiectelor;

7.2.3 Apelarea serviciilor Web n mod asincron

Utilitarul wsdl.exe genereaz metode pentru apelarea serviciului att


n mod sincron, ct asincron. Pentru apelarea asincron se genereaz cte o
pereche de metode Begin_Apel_Metod i End_Apel_Metod. Apelarea
asincron a unui serviciu Web presupune iniierea apelului prin execuia
metodei Begin care nregistreaz o funcie delegat callback ce va fi apelat la
obinerea rspunsului de la metoda serviciului.
presupunem un serviciu Web a crui execuie poate dura un timp
mai ndelungat, avnd o metod care determin toate numerele
prime pn la un numr dat ca parametru:

Serviciu C#

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
namespace Tutorials.AsyncCallService.Service
{
[WebService(Namespace = "http://aris.ase.ro/schemas")]
public class PrimeNumbersService :
System.Web.Services.WebService
{
public PrimeNumbersService()
{
InitializeComponent();
}
Reele de calculatoare

#region Component Designer generated code


private IContainer components = null;
private void InitializeComponent()
{
}
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();
}
base.Dispose(disposing);
}
#endregion
[WebMethod]
public int[] GetPrimeNumbers(int n)
{
bool[] isNotPrime = new bool[n + 1];
for(int i = 2; i <= n - 1; i++)
if(isNotPrime[i] == false)
for(int j = 2; j * i <= n; j++)
isNotPrime[j * i] = true;
ArrayList numbers = new ArrayList();
for(int i = 2; i <= n; i++)
if(isNotPrime[i] == false)
numbers.Add(i);
return (int[]) numbers.ToArray(typeof(int));
}
}
}

Interfaa serviciului Java

package tutorials.services.asynccall;
public interface IPrimeNumbersService {
public int[] getPrimeNumbers(int n);
}

se implementeaz interfaa printr-o clas serviciu:

Serviciu Java

package tutorials.services.asynccall;
public class PrimeNumbersService implements
IPrimeNumbersService {
public int[] getPrimeNumbers(int n) {
boolean[] isNotPrime = new boolean[n + 1];
int found = 0;
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

for(int i = 2; i <= n - 1; i++)


if(isNotPrime[i] == false) {
found++;
for(int j = 2; j * i <= n; j++)
isNotPrime[j * i] = true;
}
int[] numbers = new int[found];
int k = 0;
for(int i = 2; i <= n; i++)
if(isNotPrime[i] == false)
numbers[k++] = i;
return numbers;
}
}

se public serviciul pe un context Glue prin JMS (Java Messaging


Services):

Aplicaie gazd pentru serviciu Java


package tutorials.services.asynccall;
import electric.registry.Registry;
import electric.registry.RegistryException;
import electric.registry.Registry;
import electric.server.jms.JMS;
public class AsyncServer
{
public static void main(String[] arguments)
throws Exception {
JMS.startup("jms:///AsyncCallService");
Registry.publish("PrimeNumbersService",
new PrimeNumbersService());
}
}

clientul .NET conine o metod care va fi apelat n mod asincron


la primirea rezultatelor apelului ctre metoda serviciului Web:

Metoda clientului C#

public void LoadComplete(IAsyncResult result)


{
this.Cursor = Cursors.Default;
this.numbers = this.service.EndGetPrimeNumbers(result);
string message = "";
for(int i = 0; i < this.numbers.Length; i++)
message += (message.Length > 0 ? ", " : "") +
Reele de calculatoare

this.numbers[i].ToString();
Console.WriteLine(message);
}

apelul sincron al metodei serviciului este nlocuit de apelul


asincron al componentei Begin corespunztoare acesteia:

this.service.BeginGetPrimeNumbers(n, new
AsyncCallback(this.LoadComplete), null);

spre deosebire de implementarea .NET n care clientul apela alt


metod a clasei proxy, pe platforma Glue Professional clientul
apeleaz serviciul asincron prin intermediul aceleai interfee ca i
pentru apelurile sincrone, utiliznd ns alt URL pentru serviciu,
ceea ce face ca cererile s fie tratate asincron prin JMS:

Client Java

package tutorials.services.asynccall;
import electric.registry.Registry;
import electric.registry.RegistryException;
public class Client
{
public static void main(String[] args) throws
RegistryException
{
String url =
"jms://AsyncCallService/PrimeNumbersService.wsdl";
IPrimeNumbersService proxy =
(IPrimeNumbersService) Registry.bind(url,
IPrimeNumbersService.class);
int n = args.length == 1 ?
Integer.parseInt(args[0]) : 1000;
int[] numbers = proxy.getPrimeNumbers(n);
String message = "";
for(int i = 0; i < numbers.length; i++)
message += (message.length() > 0 ? ", " :
"") + numbers[i];
System.out.println(message);
}
}
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

7.2.4 Publicarea unei componente ca serviciu Web

Componentele COM+ sunt implicit apelabile la distan deoarece


extind clasa MarshalByRefObject. Publicarea unei componente
ServicedComponent ca serviciu pe IIS presupune urmtoarele aciuni:
se scrie o component de serviciu, spre exemplu care necesit
accesul tranzacional la o baz de date pentru a nregistra o
comand; tipurile de date i interfaa de apel de la distan trebuie
organizate ntr-o bibliotec referit att de serviciu care
implementeaz interfaa, ct i de clientul care face apelul ctre
serviciu:

Obiectul tranzaciei

using System.Xml.Serialization;
namespace Tutorials.ServicedComponents.Common
{
[XmlRoot("Order", Namespace =
"http://aris.ase.ro/schemas")]
public class Order
{
[XmlElement("Product", typeof(string))]
public string Product;
[XmlElement("Quantity", typeof(int))]
public int Quentity;
}
}

Interfaa de apel

namespace Tutorials.ServicedComponents.Common
{
public interface IDeliveryService
{
bool PlaceOrder(Order order);
}
}

se implementeaz interfaa de aplel prin intermediul unei


componente de serviciu gestionat tranzacional n COM+:

Component de serviciu

using System;
using System.EnterpriseServices;
Reele de calculatoare

namespace Tutorials.ServicedComponents
{
[Transaction(TransactionOption.Required)]
[JustInTimeActivation(true)]
public class DeliveryService : ServicedComponent,
Common.IDeliveryService
{

#region IDeliveryService Members


[AutoComplete]
public bool PlaceOrder(Common.Order order)
{
return DateTime.Now.Ticks % 2 == 0;
}
#endregion
}
}

se creeaz o aplicaie Web pe IIS n care se public binarele


componentei SC mpreun cu un descripor Web.config de forma:

Descriptor Web

<?xml version="1.0" encoding="utf-8" ?>


<configuration>
<system.runtime.remoting>
<application>
<service>
<wellknown mode="SingleCall"
type="Tutorials.ServicedComponents.DeliveryService,Tutorials.S
ervicedComponents"
objectUri="/ServicedComponents/DeliveryService.SOAP"/>
</service>
</application>
</system.runtime.remoting>
</configuration>

- descriptorul Web configureaz n cadrul aplicaiei un serviciu


monocanal SOAP, preciznd tipul clasei serviciu, assembly-ul n
care se gsete i adresa la care va rspunde.
- clientul nregistreaz un canal HTTP, obine de la activator o
referin local a obiectului la distan, prin intermediul creia va
putea apela metodele interfeei serviciului:
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

Client pentru componeta de serviciu

using System;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;
using System.Runtime.Remoting.Channels.Http;
namespace Tutorials.ServicedComponents.Client
{
class Client
{
[STAThread]
static void Main(string[] args)
{
try
{
HttpChannel channel = new
HttpChannel();

ChannelServices.RegisterChannel(channel);
Common.IDeliveryService service =
(Common.IDeliveryService)
Activator.GetObject(typeof(Common.IDeliveryService),
"http://localhost/ServicedComponents/DeliveryService.SOAP");
Common.Order order = new
Common.Order();
order.Product = "A Product";
order.Quentity = 1;

Console.WriteLine(service.PlaceOrder(order) ?
"Your order has been placed." :
"Your order has been rejected.");
}
catch(Exception exception)
{

Console.WriteLine(exception.ToString());
}
}
}
}

Componentele EJB gzduite de containere EJB ale serverelor de


aplicaii Java Enterprise sunt apelabile prin Remote Method Invocation
(RMI). Pentru a putea apela o component EJB prin intermediul protocolului
SOAP, platformele Java de servicii Web intercepteaz mesajele
SOAP/HTTP ale clientului pe care le ruteaz conform descriptorilor de
publicare ctre un anumit serviciu. Serviciile de tip EJB sunt gzduite de un
Reele de calculatoare

procesor care gestioneaz starea acestora, mapeaz metoda apelului SOAP


peste metoda corespunztoare a interfeei Remote a componentei EJB pe care
o apeleaz apoi prin RMI. De fapt, un serviciu Web de tip EJB nu este
altceva dect un client Java pentru componenta EJB gzduit pe serverul de
aplicaii care este apelat prin SOAP de ctre clienii externi.

pentru o component EJB publicat n JBoss pe contextul


ejb/Exchange se creeaz o aplicaie Glue folosind utilitarul
NewApp care de fapt copiaz coninutul directorului app-
template ntr-un director cu numele aplicaiei;
descriptorul aplicaiei Web, fiierul web.xml, aflat n
subdirectorul de resurse WEB-INF, conine maparea servlet-urilor
contextului curent, printre care se remarc servlet-ul glue-SOAP,
responsabil cu rutarea mesajelor SOAP ctre procesorul
serviciului:
<servlet>
<servlet-name>glue-SOAP</servlet-name>
<servlet-
class>electric.server.http.ServletServer</servlet-class>
<init-param>
<param-name>httpRegistryRoot</param-name>
<param-value>/</param-value>
</init-param>

<load-on-startup>1</load-on-startup>
</servlet>
de asemenea, tot n fiierul web.xml este configurat i procesorul
de servicii SOAPServletContext;
n subdirectorul services din WEB-INF se creeaz cte un
descriptor XML pentru fiecare serviciu gzduit de aplicaia
curent, avnd drept model fiierul sample.xml; n cazul
publicrii unei componente EJB ca serviciu Web fiierul
descriptor are urmtoare form:
<?xml version='1.0'?>
<service>
<constructor>

<class>electric.service.ejb.StatelessSessionBeanService</class
>
<args>
<contextFactory>org.jnp.interfaces.NamingContextFactory</conte
xtFactory>
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

<url>jnp://localhost:1099</url>
<jndiName>ejb/Exchange</jndiName>
<homeInterfaceName>tutorials.ejbstaff.interfaces.ExchangeHome<
/homeInterfaceName>
</args>
</constructor>
</service>

descriptorul precizeaz tipul de Bean publicat, contextul JNDI al


componentei EJB pe serverul de aplicaii i interfaa Remote de
apel;
se construiete arhiva aplicaiei Web folosind utilitarul jar cu
comanda:
jar cf nume_arhiv.war director_aplicaie
se public prin copiere n zona de publicare a serverului JBoss
(server/default/deploy)
pentru apelarea dintr-un client Java este necesar includerea unei
interfee similare interfeei Remote a componentei EJB:

Interfa de apel la client

package tutorials.ejbstaff.client;
public interface IExchange {
public double getRate(String county1, String country2);
}

Client Java

package tutorials.ejbstaff.client;
import electric.registry.Registry;
public class Client {
public static void main(String[] args) {
try {
String url = args[0];
IExchange exchange = (IExchange)
Registry.bind(url, IExchange.class);
double rate = exchange.getRate("usa",
"japan");
System.out.println("usa/japan exchange rate
= " + rate);
}
catch(Exception exception) {
System.out.println(exception.toString());
}
}
}
Reele de calculatoare

pentru apelarea dintr-un client .NET se construiete o clas proxy


prin adugarea unei referine Web la descriptorul WSDL al
serviciului; platforma Glue gzduit n JBoss livreaz descriptorul
WSDL la adresa:
http://server:port/nume_aplicaie/services/nume_serviciu.wsdl
unde numele aplicaiei este numele fiierului arhiv .war copiat n spaiul de
publicare JBoss, iar numele serviciului este numele fiierului descriptor .xml
din subdirectorul services al directorului de resurse al aplicaiei Web (WEB-
INF):

Client J#

package Tutorials.EjbStaff.NETClient;
public class Client
{
/** @attribute System.STAThread() */
public static void main(String[] args)
{
EjbService.Exchange exchange = new
EjbService.Exchange();
double rate = exchange.getRate("usa", "japan");
System.out.println("usa/japan exchange rate = " +
rate);
}
}

7.2.5 Servicii Web virtuale

Platforma Glue Professional permite publicarea unui descriptor


WSDL pentru un serviciu Web virtual avnd la baz un set de interfee. Un
serviciu virtual nu are ataat o implementare static n sensul consacrat; n
schimb se ofer posibilitatea nregistrrii unor clase care s trateze la
momentul apelului mesajele SOAP destinate serviciului virtual. Aceast
legare poate fi de nivel nalt sau de nivel sczut. Legarea de nivel nalt
utilizeaz clasa VirtualService, n timp ce legarea de nivel sczut face apel
la clasa VirtualSOAPHandler.
Implementarea unui serviciu virtual High-Level

se declar metodele interfeei serviciu:


package tutorials.services.virtual;
public interface IExchange {
public double getRate(String country1, String country2);
}
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

se ofer cel puin o implementare pentru interfaa serviciu.


Arhitectura serviciilor virtuale High-Level are la baz
mecanismul fabricii de obiecte. Spre deosebire de serviciile Web
obinuite care ataeaz o singur implementare unei interfee
publicate, serviciile virtuale permit ataarea la momentul apelului
a implementrii adecvate contextului cererii:

package tutorials.services.virtual;
public class Exchange implements IExchange {
public double getRate(String country1, String country2)
{
return Math.random() * 100;
}
}

tratarea legrii implementrii concrete de interfaa publicat nu


mai are loc n descriptorul aplicaiei sau n aplicaia gazd, ci
ntr-o clas special care se folosete de mecanismul de
Reflection pentru dispecerizarea apelurilor metodelor serviciului
ctre obiectul ce-l deservete la momentul apelului:

package tutorials.services.virtual;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ExchangeHandler implements InvocationHandler {
private IExchange exchange = new Exchange();
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
return method.invoke(exchange, args);
}
}

publicarea se poate face printr-un descriptor care precizeaz


interfaa i handler-ul virtual sau printr-o aplicaie consol gazd
ce poate fi instalat s ruleze ca serviciu de platform, n primul
caz fiind nevoie de un server de aplicaii gazd, gen Glue sau un
container pentru Glue (de exemplu Tomcat, JBoss, WebSphere,
WebLogic etc.):
package tutorials.services.virtual;
import electric.util.Context;
import electric.registry.Registry;
import electric.server.http.HTTP;
import electric.service.virtual.VirtualService;
public class ExchangePublish {
Reele de calculatoare

public static void main(String[] args) throws Exception


{
HTTP.startup("http://localhost:8004/glue");
ExchangeHandler handler = new ExchangeHandler();
VirtualService exchange = new
VirtualService(IExchange.class, handler);
Context context = new Context();
Registry.publish("exchange", exchange, context);
}
}

clientul apeleaz serviciul virtual similar apelrii unuia obinuit,


prin legarea la URL-ul descriptorului WSDL i conversia
obiectului proxy obinut la tipul interfeei serviciului, prin care
ulterior poate apela metodele acestuia, indiferent de clasa care le
implementeaz pe server:
package tutorials.services.virtual;
import electric.registry.Registry;
public class ExchangeInvoke {
public static void main(String[] args) throws Exception
{
String url =
"http://localhost:8004/glue/exchange.wsdl";
IExchange exchange = (IExchange)
Registry.bind(url, IExchange.class);
double rate = exchange.getRate("usa", "japan");
System.out.println("usa/japan exchange rate = " +
rate);
}
}

Implementarea unui serviciu virtual Low-Level

un serviciu virtual de tip Low-Level implementeaz interfaa


electric.SOAP.ISOAPHandler pentru a rspunde apelurilor
SOAP ctre metodele serviciului:

package tutorials.services.virtual;
import java.rmi.RemoteException;
import electric.xml.Element;
import electric.xml.XPath;
import electric.xml.io.encoded.EncodedWriter;
import electric.SOAP.ISOAPHandler;
import electric.SOAP.SOAPMessage;
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

import electric.util.Context;
public class ExchangeSOAPHandler implements ISOAPHandler {
static final XPath country1 = new XPath("getRate/[1]");
static final XPath country2 = new XPath("getRate/[2]");
public SOAPMessage handle(SOAPMessage request, Context
context)
throws RemoteException, SecurityException {
String arg0 =
request.getBody().getElement(country1).getString();
String arg1 =
request.getBody().getElement(country2).getString();
SOAPMessage response = new SOAPMessage();
Element body = response.addBody();
Element result = body.addElement();
result.setNamespace("n",
"http://tempuri.org/examples.publish.IExchange");
result.setName("n", "getRateResponse");
EncodedWriter writer = new EncodedWriter(result);
writer.writeDouble("Result", Math.random() * 100);
return response;
}
}

publicarea presupune nregistrarea interfeei i a handler-elor


aferente, dintre care esenial este cel care trateaz mesajele SOAP
i prin intermediul cruia rspunde de fapt serviciul:

package tutorials.services.virtual;
import electric.registry.Registry;
import electric.server.http.HTTP;
import electric.SOAP.virtual.VirtualSOAPHandler;
public class ExchangeSOAPPublish
{
public static void main(String[] args) throws Exception
{
HTTP.startup("http://localhost:8004/glue");
ExchangeHandler invokeHandler = new
ExchangeHandler();
ExchangeSOAPHandler SOAPHandler = new
ExchangeSOAPHandler();
VirtualSOAPHandler exchange = new
VirtualSOAPHandler(IExchange.class,
invokeHandler,
SOAPHandler);
Registry.publish("exchange", exchange);
}
}
Reele de calculatoare

apelarea unui serviciu virtual de tip Low-Level este similar


apelrii oricrui serviciu Web XML, clientul netiind detaliile
implementrii serviciului.

7.2.6 Autentificarea i autorizarea accesului

Autentificarea presupune identificarea utilizatorului, adic verificarea


identitii utilizatorului.
Pe platforma .NET avem trei categorii de autentificri, categorii dictate
de cine anume implementeaz mecanismul de autentificare:
IIS: Internet Information Server ofer urmtoare tipuri de autentificri:
Anonymous
Basic Authentification
Digest Authentification
Integrated Windows Authentification (NTLM sau Kerberos)
ASP.NET: introduce dou noi mecanisme de autentificare:
Forms: dezvoltatorul creeaz o pagin prin care se cere
utilizatorului s-i introduc informaiile de identificare. Pe baza
unei proceduri de validare a datelor introduse se decide dac este
autentificat sau nu.
Passport: autentificarea utilizatorului se face cu ajutorul unei tere
pri; pentru detalii despre cum anume se poate implementa acest
mecanism de autentificare vezi www.passport.com
Antete SOAP personalizate: prin care dezvoltatorul i implementeaz
propriul mecanism de autentificare. De exemplu, informaiile despre
utilizator s fie trimise sub form de parametri la metoda serviciului web.

Etapele autentificrii de tip antete SOAP personalizate:


crearea unui antet SOAP prin derivarea unei clase din SOAPHeader
coninnd credeniale criptate;
crearea i nregistrarea n web.config a unui modul HTTP care s
implementeze metoda Init i evenimentele Register ale interfeei
IHttpModule;
tratarea evenimentului Custom Authentification n Global.asax
verificndu-se dac informaiile de autorizarea accesului nu exist
deja n colecia Context.Cache. Dac nu sunt stocate n cache-ul
aplicaiei informaii despre rolul utilizatorului, atunci se construiete
un obiect de tip Credentials care se ataeaz unui obiect de tipul
Principal declarat ca utilizator curent al aplicaiei prin ncrcarea
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

obiectului Context.User. Verificarea contextului de rulare al


aplicaiei se face prin intermediul atributelor PrincipalPermission
asociat metodelor expuse de serviciu Web.
Autorizarea presupune acordarea drepturilor corespunztoare rolului jucat de
fiecare utilizator autentificat n sistem i vizeaz mai multe niveluri de acces
la resurse, i anume:
URL Authorization;
File Authorization;
Principal Permissions;
.NET Roles.

Platforma GLUE ofer suport pentru autentificarea pe client i pe server,


fiind compatibil cu majoritatea platformelor care utilizeaz autentificarea de
tip HTTP. n varianta Professional, GLUE include suport pentru integrarea
cu standardul JAAS, care permite autentificarea bazat pe sistemul
drepturilor de acces LDAP/NT. Noiunile fundamentale pentru
implementarea autentificrii pe platfoma GLUE sunt:
Principal, entitate asociat identitii utilizatorului;
Role, colecie de drepturi de acces asociat unei identiti a
utilizatorilor autentificai;
Permission, o aciune care poate fi executat de un utilizator avnd un
asociat un anumit rol;
Realm, o colecie de informaii viznd identitatea utilizatorului, rolul
asociat i permisiunile aferente;
Guard, o constrngere care utilizeaz o colecie Realm pentru a
verifica c un utilizator autentificat are dreptul s execute o anumit
aciune.
Pentru impementarea autentificrii i autorizrii accesului pe platforma
GLUE se au n vedere urmtoarele etape:
se editeaz fiierul WEB-INF/glue-config.xml n care se
precizeaz tipul autentificrii, n acest caz JAAS:
<realm>
<constructor>
o <class>electric.security.jaas.JAASRealm</class>
o <args>
<name>jaas</name>
<config>security\jaas.config</config>
o </args>
</constructor>
</realm>
se editeaz fiierul WEB-INF/services/serviciu.xml n care se
specific publicarea autentificrii i rolul aferent:
Reele de calculatoare

<publish>yes</publish>
<role>denumire_rol</role>
se editeaz fiierul WEB-INF/web.xml n care se precizeaz
metoda de autentificare:
<login-config>
<realm-name>acl</realm-name>
</login-config>
Pentru autentificarea apelului la un serviciu Web securizat se utilizeaz
obiectul ProxyContext care va fi ncrcat cu datele de autentificare ale
utilizatorului declarat n fiierele de configurare, astfel:
ProxyContext context = new ProxyContext();
context.setAuthUser("denumire_rol");
context.setAuthPassword("parol");
ISample sample = (ISample) Registry.bind(ur_wsdll,
ISample.class, context);

7.3 Nivelul de prezentare


7.3.1 Construirea unei imagini ntr-o pagin ASP.NET
Pentru exemplificare vom considera o pagin ASP.NET care afieaz ca
rezultat o imagine extras dintr-o baz de date i primit de la un serviciu
Web sub forma unui vector de octei.
Pagin ASP.NET cu Code Behind

<%@ Page language="c#" Codebehind="RoomImage.aspx.cs"


AutoEventWireup="false" Inherits="Tutorials.AspNet.RoomImage"
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
>
<html>
<head>
<title>RoomImage</title>
<meta name="GENERATOR" Content="Microsoft Visual Studio
.NET 7.1">
<meta name="CODE_LANGUAGE" Content="C#">
<meta name=vs_defaultClientScript content="JavaScript">
<meta name=vs_targetSchema
content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body MS_POSITIONING="GridLayout">
<form id="ImageForm" method="post" runat="server">
</form>
</body>
</html>
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

o pagin Web extinde clasa System.Web.UI.Page;


are acces la interfaa server-ului Web prin obiecte de forma
Request, Response, Session, Context etc;
punctul de intrare n program este handler-ului evenimentului
Load al paginii, n acest caz funcia Page_Load;

Clasa paginii

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
namespace Tutorials.AspNet
{
public class RoomImage : System.Web.UI.Page
{
private void Page_Load(object sender,
System.EventArgs e)
{
if(this.Request["RoomId"]!=null)
{
this.Response.ContentType =
"image/jpg";
Administrator.AdministratorService
service = new Administrator.AdministratorService();
byte[] image =
service.GetRoomImageData(int.Parse(this.Request["RoomId"]));
if(image == null)
{
FileStream fileStream = new
FileStream(this.Server.MapPath("tmp/admin_no_image.jpg"),
FileMode.Open);
image = new byte[new
FileInfo(this.Server.MapPath("tmp/admin_no_image.jpg")).Length
];
fileStream.Read(image, 0,
image.Length);
fileStream.Close();
}
Reele de calculatoare

this.Response.OutputStream.Write(image, 0,
image.Length);
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
{
this.Load += new
System.EventHandler(this.Page_Load);
}
#endregion
}
}

7.3.2 Apelarea unei componente dintr-un servlet

Tehnologia Servlet a fost gndit s suplineasc deficienele


arhitectuiri CGI legate de gestiunea proceselor i firelor de execuie, precum
i de securitate, avnd urmtoarele caracteristici funcionale:
pune la dispoziia programatorului obiecte pentru accesarea
interfeei server-ului Web cum ar fi HttpServletRequest,
HttpServletResponse etc., organizate n pachetele
javax.servlet i javax.servlet.http;
rspunsul generat la ieire devine sursa paginii HTML, astfel
nct un servlet nu separ procesrile i coninutul rezultat de
formatarea acestuia;
binarele unui servlet trebuie publicate n subdirectorul WEB-
INF/classes al unui context Web;
pentru a putea fi accesat, servletului i se asociaz un URL prin
intermediul fiierului de configurare web.xml sau cu ajutorul
meta-tag-ului comentariu @web.servlet-mapping, dac se
utilizeaz un mediu de construire a arhivei .war cum ar fi Ant sau
XDoclet.
Servlet care acceseaz o component EJB
package tutorial.web;
import java.io.IOException;
import java.io.PrintWriter;
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import tutorial.interfaces.Fibo;
import tutorial.interfaces.FiboHome;
/**
* @web.servlet name="Compute" display-name="Computation
Servlet"
* description="Servlet that compute Fibonacci
suite"
*
* @web.servlet-mapping url-pattern="/Compute"
*
* @web.ejb-ref name="ejb/Fibo" type="Session"
* home="tutorial.interfaces.FiboHome"
* remote="tutorial.interfaces.Fibo"
description="Reference to the
* Fibo EJB"
*
* @jboss.ejb-ref-jndi ref-name="ejb/Fibo" jndi-
name="ejb/Fibo"
*/
public class ComputeServlet extends HttpServlet {
private FiboHome home;
public ComputeServlet()
{
super();
}
public void init(ServletConfig config)
throws ServletException {
try {
Context context = new InitialContext();
Object ref =
context.lookup("java:/comp/env/ejb/Fibo");
home = (FiboHome)
PortableRemoteObject.narrow(ref, FiboHome.class);
}
catch (Exception e) {
throw new ServletException("Lookup of
java:/comp/env/ failed");
}
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
Reele de calculatoare

response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
out.println("Fibonaci Computation");
out.println("</title></head>");
out.println("<body>");
out.println("<h1>");
out.println("Fibonaci Computation");
out.println("</h1>");
try {
Fibo bean = home.create();
int limit = 0;
String value =
request.getParameter("limit");
if (value != null) {
try {
limit = Integer.parseInt(value);
}
catch (Exception e)
{
}
}
double[] result = bean.compute(limit);
bean.remove();
out.println("<p>");
out.print("The ");
out.print(limit);
out.print(" first Fibonacci numbers ");
for (int i = 0; i < result.length; i++) {
out.println("<br>");
out.println(i);
out.println(" : ");
out.println(result[i]);
}
out.println("</p>");
}
catch(Exception e) {
out.println(e.getMessage());
e.printStackTrace(out);
}
finally {
out.println("</body></html>");
out.close();
}
}
}
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

7.3.3 Definirea unui Custom Tag n JSP

Tehnologia JSP a fost dezvoltat din Servlet cu scopul separrii


prelucrrilor i coninutului de formatarea rezultatelor, avnd urmtoarele
caracteristici:
permite intercalarea de cod procesat pe server cu formatri
HTML;
la momentul primei cereri o pagin JSP este translatat ntr-un
servlet de ctre serverul de aplicaii, care este apoi compilat n
cod de octei i interpretat;
pentru orice alt cerere se compar data salvrii paginii JSP cu
data fiierului binar generat, verificndu-se astfel dac este
necesar translatarea i recompilarea paginii;
Principiul separrii procesrilor de formatarea rezultatelor este cel
mai bine exemplificat n standarduol JSP 2.0 de tehnologia
Custom Tags. Pentru implementarea unui Custom Tag este
necesar scrierea urmtoarelor componente:
o clas tag handler: reprezint o clas Java care precizeaz modul
n care tag-ul produce rezultat HTML; extinde clasa TagSupport
sau BodyTagSupport i implementeaz interfaa Tag din pachetul
javax.servlet.jsp.tagext, fiind publicat n contextul
aplicaiei mpreun cu celelalte clase i componente Bean ale
acesteia;
un fiier descriptor al bibliotecii de tag-uri: descrie n format
XML numele, atributele i handler-ele tag-urilor, fiind publicat
mpreun cu paginile JSP sau pe o anumit adres URL dac
aparine altui context dect cel al aplicaiei Web curente;
fiierele JSP: import biblioteca de tag-uri prin intermediul
fiierului descriptor, asociindu-i un prefix de tag pentru a putea
utiliza tag-uri ale acesteia n codul JSP.
Implementarea handler-ului tag-ului necesit:
extinderea clasei TagSupport din pachetul
javax.servlet.jsp.tagext;
rescrierea metodei doStartTag;
se obine o referin la obiectul JspWriter al fluxului de
procesare a ieirii paginii, prin care se genereaz coninutul JSP;
metoda ntoarce constanta SKIP_BODY n cazul unui tag simplu,
fr imbricri de tip corp de tag;
Reele de calculatoare

codul este translatat n servlet la momentul primei cereri a paginii


JSP, genernd apoi rspuns HTML prin execuie pentru fiecare
cerere n parte.

Custom Tag fr imbricare

package tutorials.customtags;
import java.io.IOException;
import java.util.Random;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class SimpleRandomTag extends TagSupport {
protected int length;
public int doStartTag() {
try {
JspWriter out = this.pageContext.getOut();
out.print(new
Random().nextInt(this.length));
}
catch(IOException exception) {
System.out.println(exception.toString());
}
return SKIP_BODY;
}
}

Se scrie apoi descriptorul XML al bibliotecii de tag-uri custom, atfel:


dup antetul documentului XML cu DOCTYPE, tag-ul rdcin
este taglib;
fiecare tag este definit de elementul tag preciznd numele
tag-ului i handler-ul care-l trateaz;
nodul name precizeaz numele tag-ului curent;
nodul tagclass indic numele clasei handler calificat cu pachetul
acesteia;
nodul info conine o scurt descriere a tag-ului curent.

Descriptor pentru biblioteca de tag-uri custom

<?xml version="1.0" encoding="ISO-8859-1" ?>


<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tag>
<name>simpleRandom</name>
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

<tagclass>tutorials.customtags.SimpleRandomTag</tagclass>
<info>Outputs a random integer.</info>
</tag>
</taglib>

Utilizarea unui tag dintr-o bibliotec ntr-o pagin JSP presupune:


se import biblioteca de tag-uri preciznd locaia acesteia relativ
la contextul aplicaiei sau absolut:

<%@ taglib uri="customjsp-taglib.tld" prefix="customjsp" %>

se definete un prefix asociat bibliotecii importate

<prefix:tagName />

se apeleaz tag-uri din bibliotec prefixate corespunztor


importului

<customjsp:simpleRandom />

Pagin JSP care utilizeaz un Custom Tag

<%@page contentType="text/html" %>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ taglib uri="/WEB-INF/jsp/CustomTags.tld" prefix="mytags"
%>
<html>
<head>
<title>JSP Page</title>
</head>
<body bgcolor="#FFFFFF">
<mytags:simpleRandom/>
</body>
</html>

Acest mecanism poate fi extins sub forma unui custom tag cu atribute i
coninut:
se declar n handler-ul tag-ului proprieti pentru fiecare atribut
al su;
setarea unui atribut n cadrul tag-ului echivaleaz cu apelarea
metodei setter a obiectului handler;
se declar atributul n descriptorul tag-ului
Reele de calculatoare

Custom Tag care extinde un tag simplu prin adugarea unui atribut

package tutorials.customtags;
public class RandomTag extends SimpleRandomTag {
public void setLength(int length)
{
this.length = length;
}
}

Descriptor pentru un Custom Tag cu atribute

<tag>
<name>random</name>
<tagclass>tutorials.customtags.RandomTag</tagclass>
<attribute>
<name>length</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>

7.4 Interoperabilitatea platformelor .NET i J2EE

Pe piaa platformelor software pentru aplicaii distribuite de ntreprindere


exist n prezent dou mari clase consacrate: .NET i J2EE. Dei din raiuni
de compatibilitate i integrare am fi tentai s optm pentru o soluie
omogen cnd se pune problema implementrii unui sistem de ntreprindere,
totui teoria avantajului comparativ evideniaz necesitatea cooperrii celor
mai bune tehnologii pentru fiecare nivel n parte. Interoperabilitatea celor
dou platforme este necesar din urmtoarele considerente practice:
eterogenitatea platformelor hardware i software existente n
mediul de ntreprindere;
controlul total este ineficient;
specificul aplicaiei trebuie avut n vedere la alegerea unei
platforme;
ca rezultat, majoritatea companiilor combin tehnologiile;
la baza oricrui demers de combinare a platformelor software st
satisfacerea nevoilor clienilor ntr-o msur ct mai mare.
Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

Potrivit percepiei comune o aplicaie eterogen care se bazeaz pe


cele dou platforme ar trebui s foloseasc tehnologii .NET pe partea de
client i tehnologii J2EE pe partea de server, deoarece:
soluia .NET este mai bun pe partea de client, avnd drept atuuri:
interfaa client adaptat i optimizat pentru platforma Windows,
folosit de majoritatea utilizatorilor finali ai produselor
informatice de ntreprindere;
ofer suport extins pentru dispozitive mobile i protocoale
dedicate gen WAP;
se integreaz cu suita de aplicaii Office.

pe de alt parte, soluia J2EE este potrivit pentru nivelurile logicii


aplicaiei i de acces la date, deoarece:
ofer o performan ridicat, avnd un grad nalt de scalabilitate;
este mai mentenabil dect .NET;
are un raport calitate / pre superior, oferind soluii fiabile.

Aceast abordare nu este ntotdeauna cea optim.


Se pot imagina trei scenarii de interoperabilitate plauzibile:
punte RMI .NET Remoting:
are drept principal avantaj performana ridicat a comunicaiei,
putnd utiliza o gam foarte larg de protocoale peste TCP, unele
chiar mpachetate binar i arhivate;
ca dezavantaje se remarc complexitatea ridicat, necesitnd
convertoare de protocol, proprietatea obiectelor COM+ pe
platforma .NET precum i dependena de versiunea obiectelor.
apelul prin cozi de mesaje:
prezint avantajul cuplrii slabe, permind comunicarea intra i
inter-niveluri, n condiiile existenei unui suport extins pentru
tranzacii i securitate;
ca principal dezavantaj se nscrie absena operaiilor sincrone,
introducndu-se penalizri temporare semnificative pentru
sincronizare, alturi de posibile neajunsuri de acces pe porturi
prin Firewall.
Reele de calculatoare

servicii Web:
se remarc drept varianta optim de interoperabilitate pentru
cele mai multe situaii datorit cuplrii slabe, n condiiile
executrii de operaii sincrone, ct i asincrone, fr restricii
de tip Firewall sau conversii de protocoale de comunicaie;
pn n prezent are totui dezavantajul implementrii pariale
a standardelor pentru securitate, dar mai ales pentru tranzacii.
Dezvoltarea modelului GXA (Global XML Web Services
Architecture) intenioneaz s nlture aceste neajunsuri prin
protocoale de tipul WS-Security, WS-Attachement sau
WS-Routing.