Sie sind auf Seite 1von 120

Cuprins

1. Introducere .....................................................................................................
1.1. Modelul client - server ......................................................................................................... 1.2. URL. Scheme URL ................................................................................................................. 1.3. Hipertext, hiperlegtur, hipermedia ............................................................................. 1.4. Protocolul HTTP (Hypertext Transfer Protocol) ..........................................................

2. FTP i pota electronic ...............................................................................


2.1. Serviciul FTP transfer de fiiere .................................................................................. 2.1.1. Server FTP ................................................................................................................ 2.1.2. Client FTP ................................................................................................................. 2.2. Serviciul de pot electronic e-mail ........................................................................... 2.3. Exerciii ..................................................................................................................................

3. Servere WEB ..................................................................................................


3.1. Introducere ............................................................................................................................ 3.2. IIS ........................................................................................................................................... 3.3. Exerciii IIS ......................................................................................................................... 3.4. NCSA ....................................................................................................................................... 3.5. Apache .................................................................................................................................... 3.6. Exerciii NCSA, Apache .....................................................................................................

4. Utilitare TCP - IP ..........................................................................................


4.1. Utilitare TCP - IP .................................................................................................................. 4.2. Testarea unei configuraii TCP - IP ................................................................................. 4.3. Exemple de folosire a unor utilitare TCP - IP ...............................................................

5. Adresare IP ....................................................................................................
5.1. Clase de adrese ..................................................................................................................... 5.2. Exerciii rezolvate ...............................................................................................................

6. Comunicare client server la nivel de socket .........................................


6.1. Introducere ............................................................................................................................ 6.2. Interfaa socket .................................................................................................................. 6.2.1. Comunicaie client server TCP - IP ................................................................. 6.2.2. Comunicaie client server UDP - IP ................................................................ 6.3. Exemplificri .........................................................................................................................

4 5 6 8 9 10 10 10 11 12 18 19 19 19 21 22 26 27 30 30 33 34 35 35 39 43 43 44 48 52 53 65 68 68 71 81 81

7. Implementarea aplicaiilor distribuite pe platformele .NET i J2EE ......................................................................................................................


7.1. Nivelul de acces la date ....................................................................................................... 7.1.1. Apelarea procedurilor stocate pe SQL Server ............................................... 7.1.2. Vizualizarea accesului la baza de date .............................................................. 7.2. Nivelul logicii aplicaiei ....................................................................................................... 7.2.1. Apelarea procedurilor la distan .......................................................................

7.2.2. Serializarea tipurilor de date complexe .......................................................... 7.2.3. Apelarea serviciilor WEB n mod asincron ....................................................... 7.2.4. Publicarea unei componente ca serviciu WEB ................................................. 7.2.5. Servicii WEB virtuale ............................................................................................ 7.2.6. Autentificarea i autorizarea accesului ........................................................... 7.3. Nivelul de prezentare .......................................................................................................... 7.3.1. Construirea unei imagini ntr-o pagin ASP.NET ............................................. 7.3.2. Apelarea unei componente dintr-un servlet .................................................... 7.3.3. Definirea unui Custom Tag n JSP ..................................................................... 7.4. Interoperabilitatea platformelor .NET i J2EE ..........................................................

Bibliografie ..........................................................................................................

86 90 94 99 103 105 105 107 110 113 116

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. 4

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. 5

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 calculatoruluiclient 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.

10

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 ftp-data 21/tcp; 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 ftpd tcp nowait root /usr/sbin/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/

11

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; 12

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 Agent Utilizator (UA)


SMTP

Bogdan

Agent Utilizator (UA) Agent postal (MTA)


POP, IMAP

Agent postal (MTA) SMTP Agent postal (MTA) Cutie postala pentru Andrei Agent postal (MTA) 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 13

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). 14

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 (numeparol), 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.

15

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. 16

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 MIME text/plain Tipul informaiei asociate 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. 17

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).

18

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; 19

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; 20

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) (CRTLALT-DEL -> Task Manager -> Processes) (Control Panel-> Services); 4. Lansai pagina implicit a IIS (http://localhost/);

21

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.

22

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.

23

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 > 24

Reele de calculatoare

Order Allow, Deny Allow from all < / Limit > < / Directory >

* implicit este Deny

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; 25

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. 26

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. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Conectai-v pe un server de Unix (exp: infocib.ase.ro) Verificai ce servere de Web ruleaz (NCSA, apache) (ps aux). Unde se gsesc aceste servere? (/usr/local/etc/httpd/; /var/apache/...) Pe ce porturi ruleaz (netstat a), ce versiune de software? (httpd help) Vizualizai structura de directoare i fiierele de configurare pentru fiecare n parte. 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? Transferai pe server fiierele .html. 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. Accesai pagina voastr de Web de pe infocib, utiliznd fiecare server de Web instalat. (~cont). Accesai o pagin situat n alt subdirector din Web. Studiai documentaia apache sub Unix de pe server. 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-x86no_ssl.msi 2. Documentaie: --------,,-----------/apachedocs.pdf 3. Instalare: a. alegei varianta custom b. pornire manual pe portul 8080 c. directorul c:\apache\

27

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 28

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>

29

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 Testeaz conexiunea cu un computer ping Afieaz coninutul cache-ului local n care sunt stocate arp adresele IP asociate adreselor fizice ale plcilor de reea (MAC) pentru computerele din LAN Afieaz configuraia TCP/IP curent ipconfig Afieaz statistici i conexiuni pentru protocolul NetBT nbtstat Afieaz statistici i conexiuni pentru protocolul TCP/IP netstat Afieaz sau modific tabela de rutare local route hostname Afieaz numele computerului Verific ruta pn la un computer aflat la distan tracert Verific dac routerele de pe drumul pn la un computer aflat pathping 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. 30

Reele de calculatoare

Utilitare pentru conectarea la distan folosind protocolul TCP/IP Utilitar FTP TFTP Telnet RCP RSH REXEC Tabel 4.2 Descriere Faciliteaz transferul bidirecional de fiiere ntre un computer pe care ruleaz Windows i un server FTP (de exemplu, Windows 2000 Server). Faciliteaz transferul bidirecional de fiiere ntre un computer pe care ruleaz Windows i un server TFTP. Ofer o conexiune la un computer ce suport protocolul telnet. Sistemele de operare Microsoft nu ofer suport dect pentru clieni telnet. 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. Ruleaz comenzi pe un computer pe care este instalat UNIX. 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 31

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: Format de redare redus -b -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. 32

Reele de calculatoare

Opiuni: -a -d nume

Afieaz toate intrrile din tabele ARP curent 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.

33

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.

34

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) 35

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 Adresa IP Adres de reea Descriere 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). 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. Numr pe 32 bii scris de obicei n format zecimal 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. 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.

Adres de broadcast

Masc de reea

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.

36

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 Clas Numr de octei-bii utilizai pentru a identifica reeaua Numr de octei-bii utilizai pentru a identifica interfaa Tabel 5.2 Numrul de adrese asignabile pe reea* 24 2 -2 216 - 2 28 - 2

A 1 (8) 3 (24) B 2 (16) 2 (16) C 3 (24) 1 (8) *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 Clas Valoarea primului octet 1 - 126 128 191 192 - 223 Adrese de reea valide Numr de adrese de reea valide Tabel 5.3 Numrul de adrese asignabile pe reea 224 - 2 216 - 2 28 - 2

A B C

1.0.0.0 126.0.0.0 27 2 128.1.0.0 214 2 191.254.0.0 192.0.1.0 221 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.

37

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 Clas A B C Numr de octei-bii ce identific reeaua 1 (8) 2 (16) 3 (24) Tabel 5.4 Masca de reea standard 255.0.0.0 255.255.0.0 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

Reea

Sub-reea

Host

24

8-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.

38

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: Masca de reea: Rezultatul: 134.141.7.11 1000 0110 1000 1101 0000 0111 0000 1011 255.255.255.0 1111 1111 1111 1111 1111 1111 0000 0000 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: Masca de reea: Rezultatul: 193.193.7.7 1100 0001 1100 0001 0000 0111 0000 0111 255.255.255.0 1111 1111 1111 1111 1111 1111 0000 0000 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.

39

Adresare IP

Adresa: Masca de reea: Rezultatul: Adresa de broadcast

134.141.7.11

1000 0110 0000 1011 255.255.255.0 1111 1111 0000 0000 134.141.7.0 1000 0110 0000 0000 134.141.7.255 1000 0110 1111 1111

1000 1101 0000 0111 1111 1111 1111 1111 1000 1101 0000 0111 1000 1101 0000 0111

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 S2 S3 S4 S5 S6 Sn 0000 1010 0000 0000 0000 0000 0000 0000 0000 1010 0000 0000 0000 0001 0000 0000 0000 1010 0000 0000 0000 0010 0000 0000 0000 1010 0000 0000 0000 0011 0000 0000 0000 1010 0000 0000 0000 0100 0000 0000 0000 1010 0000 0000 0000 0101 0000 0000 0000 1010 1111 1111 1111 1111 0000 0000 10.0.0.0 10.0.1.0 10.0.2.0 10.0.3.0 10.0.4.0 10.0.5.0 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 40

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 de bii de subreea Numrul minim 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.

41

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 Router A Ethernet Router B Ethernet Router C Ethernet Linie serial A-B Linie serial A-C Linie serial C-B Masc de subreea 255.255.254.0 255.255.254.0 255.255.254.0 255.255.254.0 255.255.254.0 255.255.254.0 Adres subreea 172.16.2.0 172.16.4.0 172.16.6.0 172.16.0.0 172.16.8.0 172.16.10.0 Adresa IP router 172.16.2.1 172.16.4.2 172.16.6.3 172.16.0.1 (A) i 172.16.0.2 (B) 172.16.8.1 (A) i 172.16.8.3 (B) 172.16.10.2 (B) i 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 Subreeaua 172.16.4.0/23

Ruterul C Subreeaua 172.16.6.0/23

42

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; 43

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 socket(protofamily, type, protocol) close(socket) bind(socket, localaddr, addrlen) listen(socket,queuesize) newsock = accept(socket, caddress, caddresslen) connect(socket, saddress, saddresslen) Descriere creeaz un socket nchide un socket leag socket-ul cu un port pune socket n mod pasiv accept o cerere de conectare stabilete legtura cu un server care a fcut accept

44

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

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 }

45

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) 46

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 47

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() ce rere write() rspuns close()

write ()

read()

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; 48

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() 49

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.

50

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()) 51

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);

52

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> 53

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); } 54

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 serverclient */ 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); } 55

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 */ 56

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); } 57

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)) 58

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 \n", (client.sin_family == AF_INET? \Internet: %s "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) { 59

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); } 60

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; 61

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); } 62

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; } 63

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 */ } }

64

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 65

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 66

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.

67

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 68

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 AS SELECT SELECT SELECT SELECT RETURN PROCEDURE dbo.getProducts * * * * FROM FROM FROM FROM Categories; Producers; Products; Stock;

69

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(

70

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 71

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; } } }

72

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()

73

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();

74

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;

75

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

76

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) {

77

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. 78

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() { }

79

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. 80

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 {

81

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(); }

82

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"); } } }

83

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; } }

84

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()); } } }

85

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;

86

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 87

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE

precizeaz c binarele aplicaiei vor fi depuse n calea WEBINF/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

88

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" +

89

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(); }

90

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;

91

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 ? ", " : "") +

92

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); } }

93

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 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: extind 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;

94

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:

95

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 96

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 apptemplate 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> <servletclass>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>

97

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()); } } }

98

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 (WEBINF):

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); }

99

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 {

100

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;

101

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); } }

102

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 103

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: 104

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>

105

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(); }

106

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 WEBINF/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;

107

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" jndiname="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 {

108

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(); } } }

109

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;

110

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>

111

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 112

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.

113

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.

114

Cuprins
4 5 6 8 9 10 10 10 11 12 18 19 19 19 21 22 26 27 30 30 33 34 35 35 39 43 43 44 48 52 53 65

1. Introducere .....................................................................................................

1.1. Modelul client - server .........................................................................................................

1.2. URL. Scheme URL .................................................................................................................

1.3. Hipertext, hiperlegtur, hipermedia .............................................................................

1.4. Protocolul HTTP (Hypertext Transfer Protocol) ..........................................................

2. FTP i pota electronic ...............................................................................


2.1.1. Server FTP ................................................................................................................ 2.1.2. Client FTP .................................................................................................................

2.1. Serviciul FTP transfer de fiiere ..................................................................................

2.2. Serviciul de pot electronic e-mail ...........................................................................

2.3. Exerciii ..................................................................................................................................

3. Servere WEB ..................................................................................................

3.1. Introducere ............................................................................................................................

3.2. IIS ...........................................................................................................................................

3.3. Exerciii IIS .........................................................................................................................

3.4. NCSA .......................................................................................................................................

3.5. Apache ....................................................................................................................................

3.6. Exerciii NCSA, Apache .....................................................................................................

4. Utilitare TCP - IP ..........................................................................................

4.1. Utilitare TCP - IP ..................................................................................................................

4.2. Testarea unei configuraii TCP - IP .................................................................................

4.3. Exemple de folosire a unor utilitare TCP - IP ...............................................................

5. Adresare IP ....................................................................................................

5.1. Clase de adrese .....................................................................................................................

5.2. Exerciii rezolvate ...............................................................................................................

6. Comunicare client server la nivel de socket .........................................

6.1. Introducere ............................................................................................................................ 6.2.1. Comunicaie client server TCP - IP ................................................................. 6.2.2. Comunicaie client server UDP - IP ................................................................

6.2. Interfaa socket ..................................................................................................................

6.3. Exemplificri .........................................................................................................................

7. Implementarea aplicaiilor distribuite pe platformele .NET i

7.2.2. Serializarea tipurilor de date complexe .......................................................... 7.2.3. Apelarea serviciilor WEB n mod asincron ....................................................... 7.2.4. Publicarea unei componente ca serviciu WEB ................................................. 7.2.5. Servicii WEB virtuale ............................................................................................ 7.2.6. Autentificarea i autorizarea accesului ........................................................... 7.3.1. Construirea unei imagini ntr-o pagin ASP.NET ............................................. 7.3.2. Apelarea unei componente dintr-un servlet .................................................... 7.3.3. Definirea unui Custom Tag n JSP .....................................................................

7.3. Nivelul de prezentare ..........................................................................................................

7.4. Interoperabilitatea platformelor .NET i J2EE ..........................................................

Bibliografie ..........................................................................................................

86 90 94 99 103 105 105 107 110 113 116

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.

115

Bibliografie
1. 2. 3. 4. 5. BURAGA, S. CIOBANU, G. CRAWFORD W., KAPLAN, J. GULZAR, N., GANESHAN, K. JURCA, I. MCLEAN, S., NAFTEL, J., WILLIAMS, K. MONSON-HAEFEL, R. NSTASE, F., NSTASE, P. NSTASE, F. PELTZER, D. Atelier de programare n reelele de calculatoare, Iai, Editura Polirom, 2001; J2EE Design Patterns, OReilly, 003; Practical J2EE Application Architecture, McGraw-Hill, 2003; Programarea reelelor de calculatoare, Timioara, Editura de Vest, 2001; .NET Remoting, MS Press, 2003;

6. 7. 8. 9.

J2EE Web Services, Addison-Wesley, 2003; Tehnologia aplicaiilor WEB, Bucureti, Editura Economic, 2002; Arhitectura reelelor de calculatoare, Bucureti, Editura Econmic, 1998 .NET & J2EE Interoperability, McGraw-Hill, 2004; .NET for Java Developers: Migrating to C#, Addison Wesley, 2003; Advanced .NET Remoting, APress, 2002;

10. PUVVALA, J., POTA, A. 11. RAMMER, I.

116

Bibliografie

12. ROCA, I., PU, N., CRISTEA, V., ATANASIU, I., NSTASE, Fl., PAIU, O., STANCIU, C., COSTINESCU, B., GODZA, G., 13. STANCIU-TIMOFTE, C.

INTERNET & INTRANET - Concepte i aplicaii, Bucureti, Editura Economic, 2000;

Baze de date pentru comer electronic pe suport Internet, Bucureti, Editura Oscar Print, 2002; J2EE 1.4 Tutorial, Sun Microsystems, 2003.

14. * Sun

Resurse Apache: Tomcat, Struts http://www.apache.org Eclipse: Eclipse SDK http://www.eclipse.org IBM: WSDK http://www.ibm.com JBoss: JBoss Server, JBoss IDE for Eclipse http://www.jboss.org Microsoft: .NET SDK, UDDI SDK, MSDE
http://www.microsoft.com

Mono: .NET Framework for Linux http://www.go-mono.com MySQL: MySQL Server, ADO.NET Providers, JDBC Drivers
http://www.mysql.com

Sun: J2SDK, J2EE, JWSDP http://java.sun.com WebMethods: Glue http://www.webmethods.com

117

Das könnte Ihnen auch gefallen