Sunteți pe pagina 1din 123

Cuprins 1. Introducere ................................................................. .................................... 1.1. Modelul client - server ................................................... ...................................................... 1.2. URL. Scheme URL ....

................................................................................ ............................. 1.3. Hipertext, hiperlegtur, hipermedia ............ ................................................................. 1.4. Protocolu l 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 co nfiguraii TCP - IP .............................................................. ................... 4.3. Exemple de folosire a unor utilitare TCP - IP ......... ...................................................... 5. Adresare IP ................................................................. ................................... 5.1. Clase de adrese ........................................................... .......................................................... 5.2. Exerciii rezolvat e .............................................................................. ................................. 6. Comunicare client server la nivel de socket ................................. ........ 6.1. Introducere ............................................................... ............................................................. 6.2. Interfaa socke t .............................................................................. .................................... 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 4 8 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 proceduril or 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 component e ca serviciu WEB ................................................. 7.2.5. Servi cii WEB virtuale ............................................................... ............................. 7.2.6. Autentificarea i autorizarea accesului ..... ...................................................... 7.3. Nivelul de prezentar e .............................................................................. ............................ 7.3.1. Construirea unei imagini ntr-o pagin ASP.NET . ............................................ 7.3.2. Apelarea unei componente din tr-un servlet .................................................... 7.3.3. Defini rea 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 t ehnologiilor hardware, software i de interconectare. Tehnologii de mare vitez au d us la utilizarea reelelor de calculatoare n toate domeniile vieii socio-economice, cu rezultate deosebite. Clasificarea reelelor de calculatoare, dup criteriul dista nei, n LAN (Local Area Network), MAN (Metropplitan Area Nerwork) i WAN (Wide Area N etwork) 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 rs pndite sunt: WWW, pota electronic (e-mail), transferul fiierelor (ftp), conectarea l a distan (telnet, ssh). Unul dintre cele mai folosite servicii Internet este servi ciul Web. WWW (World Wide Web), cunoscut i sub denumitrea de Web sau W3, reprezin t serviciul Internet care permite navigarea pe colecii de documente multimedia (hy pertexte), din diferite reele, calculatoare prin hyperlegturi, utiliznd o interfa com un (browser-ul). Caracteristici: Se deosebete de alte servicii Internet deoarece, prin concepia sa, nglobeaz alte servicii ca: FTP, Gopher, Telnet, News. Reprezint su bnivelul superior al nivelului aplicaie. Face apel la urmtoarele elemente: o URL ( Universal Resource Locators) identificatorul uniform al resurselor; o HTTP (Hype rText 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 ba z protocolul TCP/IP, este modelul client-server, model dup care funcioneaz toate apl icaiile i serviciile Internet. Clientul, de obicei, ruleaz pe calculatorul utilizat orului 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 docume ntele innd cont de tag-urile HTML; afieaz documentele. Exemple: Netscape, Internet E xplorer, Lynx, HotJava, Mosaic. Serverul ruleaz, de obicei, pe un calculator cent ralizator sau aflat la distan, furniznd sau oferind informaii/servicii clienilor. Exe mple: Apache, NCSA, IIS (daemon httpd). Client (cerere/rspuns) Server

Figura 1.1 Modelul client-server Modelul client-server are la baz un protocol sim plu, fr conexiune de tipul ntrebare-rspuns. La implementarea modelului client-server se ine seama de: adresarea proceselor server; tipul primitivelor utilizate n tran sferul 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 oduri 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 regsir e 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 (U niform 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 altu l din orice parte a Internet-ului. Suportul principal pentru URL l reprezint docum entul de tip hipertext. Acest document conine link-uri (legturi la alte servere) n ormalizate de tip URL. Hipertextul se descrie printr-un limbaj foarte simplu, ca re se poate implementa n orice fiier ASCII, numit html. Sintaxa general Un URL comp let const ntr-o schem, urmat de un ir de caractere cu format special, care este o fun cie 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 pen tru a identifica host-ul pe care sunt stocate fiierele; un descriptor de cale pen tru amplasarea punctului (locaiei) pe acea main. URL-ul trebuie s nceap cu numele sche mei, urmat de :, apoi adresa locaiei unde se gsete resursa, ncadrat ntre caracterele: opional un nume de utilizator i o parol. 6

Reele de calculatoare Pentru protocoalele Internet avem urmtoarea form general: schema://[ [nume-utilizat or] [:parola]@ ] nume-de-domeniu-Internet [:numr-port] [/lista-de-directori] [/nu me-de-fisier] Dac nu se specific numele de utilizator i parola corespunztoare, atunc i nseamn c avem de-a face cu un utilizator anonimous. Conform cu definiia BNF a sint axei, 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 trans fer http://host[:port][/cale][?cautare] hipertexte FTP Protocol de transfer de f tp://[user[:parola]@]host/cale fiiere MAILTO Adresa de E-mail mailto:user@host NE WS tiri Usenet news:grup-discutii NNTP tiri Usenet pentru acces nntp:grup/cifre lo cal NNTP FILE Acces la fiiere file://host/cale TELNET Referire la o sesiune telne t://host[:port] interactiv Tipuri de URLuri: relative - exp: doc/document_html; abso lute - exp: met_acces://nume_server[:port]/cale/. Termeni UR*: URI Universal Resou rce Identifier este numele pentru identificatorul generic WWW. Specificaiile URI definesc sintaxa pentru codificarea arbitrar a schemelor i conin o list a acestor sc heme. 7

Introducere

URL Uniform Resource Locator este o reprezentare compact a locaiei i a metodei de a cces 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 s erverul 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: a utorul, publicistul, tipul de dat, data calendaristic, elemente de copyright i dime nsiunea documentului. 1.3 Hipertext, hiperlegtur, hipermedia Hipertext este un tex t ce conine legturi numite hiperlegturi sau ancore, ctre alte texte sau informaii. Ur mrind 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 undev a 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 sin gur click cu mouse-ul pe fiecare fraz superluminat i browser-ul va urmri automat ace a legtur i va afia pe ecran o nou informaie. Trebuie specificat c nu este necesar cit a linie cu linie a acestui hipertext. Umrind un anumit set de legturi, cititorul p oate naviga nainte sau napoi n cadrul unui singur document, n timp ce alte legturi l p ot purta n oricare punct din cadrul oricrui alt document din cadrul Web-ului. n pre zent, termenul hipertext semnific doar textul de baz al documentului. Multe alte d ocumente din Web sunt hipermedia, coninnd imagini i legturi cu grafice, animaie i sune te. 8

Reele de calculatoare

1.4 Protocolul HTTP (Hypertext Transfer Protocol) Caracteristici: Este cel mai i mportant 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 hi ermedia. Este un protocol generic, orientat obiect, care poate fi folosit cu uuri n 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 d atelor, construirea de sisteme independente de date care vor fi transferate. Est e 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 s erviciile 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 t ransmise. 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 star e care definesc un circuit virtual. Acest circuit virtual consum resursele att ale serverului, ct i ale clientului. Circuitul virtual este full-duplex, datele pot c ircula n ambele direcii simultan. 9

2 FTP i pota electronic 2.1 Serviciul FTP - Transfer de fiiere Caracteristici: Permite transferul fiierelo r 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 public e, 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 ce r introducerea ca parol a adresei de pot electronic a utilizatorului client. n mod no rmal, 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 mon itorizare a reelei s o afle. Din acest motiv, transferul de informaii prin FTP se v a efectua doar n zone n care se tie c nu este posibil monitorizarea reelelor de ctre o ice 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 es te: 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 se rver; portul 20 - de pe care serverul iniiaz conexiunea pe care se va face transfe rul 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 aso ciat 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 trebui e 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 c a 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 d ezvolt i administreaz servere WWW (Microsoft FrontPage, Macromedia Dreamweaver) la cele de aplicaii de birotic (Microsoft Office, existnd variante care integreaz perfe ct clientul FTP cu Windows Explorer). Programele "ascund" comenzile clientului f tp din linia de comand, majoritatea punnd accent sporit pe transferul informaiilor de la client la server, spre deosebire de situaia clasic, n care transferul majorit ar era de la server la client. Clientul pe staia utilizatorului, poate fi: comand a ftp - de al prompt-ul DOS; un program sub SO Windows (exp: WinFTP); tasta uplo ad al browser-ului Internet Explorer, folosind schema URL: ftp://user@infocib.as e.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 se rver-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 vo astra/ sau unde dorii s le punei pe cele aduse >bin trecerea modului de transfer di n ASCII n binar; se recomand pentru fiiere ZIP, EXE, imagini etc. >hash vizualizare a transferului fiecrui 2048 B >cd director_server schimb directorul din home direc tory-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 pun e 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 Servic iul de pot electronic e-mail Cunoscut i sub denumirea de e-mail (electronic mail), e ste cel care a stat la baza dezvoltrii Internet-ului, datorit caracteristicii sale de a permite trimiterea de documente electronice ntre utilizatorii conectai la ree a. Funcionarea serviciului poate fi considerat asincron, n sensul c emitorul i recept l 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 es te de obicei un program cu care utilizatorul i citete i trimite pota electronic; 2. se rverul de pot electronic (cutia potal), locul n care ajunge pota electronic i din ca entul 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 pos tal (MTA) Cutie postala pentru Bogdan

Figura 2.1 Modul de transmisie a potei electronice i protocoalele utilizate n cadru l acestui sistem La terminarea compunerii unei scrisori, agentul utilizator o pl aseaz ntr-o coad prelucrat de agentul de transfer. Acesta ateapt ca n coada sa de intr re s fie plasat o scrisoare, pe care o trimite tuturor destinatarilor. Pentru a tr imite scrisoarea unui destinatar, agentul de transfer acioneaz ca un client i conta cteaz serverul mainii de la distan n care se afl cutia potal a destinatarului. Client stabilete o legtur TCP cu serverul i i trimite mesajul, n conformitate cu protocolul S MTP (Simple Mail Transport Protocol). Serverul primete mesajul i plaseaz copia scri sorii n cutia corespunztoare destinatarului. Programul de transfer este optimizat s trateze mpreun toi recipienii situai ntr-o aceeai main distant. Pentru comunicar ilizatorii diferitelor sisteme de pot electronic s-au introdus pori de pot electronic realizeaz conversia ntre formatele de mesaje proprietare i permit, astfel, transmit erea mesajelor dintr-un sistem n altul). Pota electronic are faciliti importante de r etransmitere a mesajelor ctre unul sau mai muli destinatari. Programul care realiz eaz retransmiterea 13

FTP i pota electronic

folosete o baz de date, din care afl cum trebuie s prelucreze mesajul. Fiecare intra re n baza de date, numit list potal (mailing list) are propria sa adres potal i con ulime de adrese. La sosirea unei scrisori, programul examineaz adresa de destinaie i determin dac aceasta corespunde unei liste potale. Dac da, atunci programul retrans mite o copie a mesajului ctre fiecare adres din list. Programul de retransmitere co nsum 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 po ale sunt, de obicei, publice. Mesajele de pot electronic sunt compuse din trei pri, p rimele 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 regu l binare i nsoesc mesajul principal. Din punctul de vedere al utilizatorului, cele m ai importante cmpuri ale antetului se refer la adresa destinatarului (sau ale dest inatarilor). 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 rbon copy, copie la indigo) specific, de asemenea, o list de persoane care vor pri mi copii ale mesajului. Atunci cnd se dorete trimiterea mesajului ctre un destinata r, fr ca receptorii s cunoasc acest lucru, se poate folosi cmpul bcc: (blind carbon c opy, copie la indigo invizibil). Adresele de pot electronic au formatul general util izator@server_pot, unde utilizator este numele de cont sau un pseudonim al destina tarului, 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 protoco ale de comunicaie ntre MTA-uri, definit n RFC 821. El este folosit att pentru comuni carea ntre agenii de transport al potei, ct i pentru transmisia mesajului de la agent ul utilizator ctre serverul local de transmisie a potei electronice (care, n mod uz ual, 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 numet e POP3 permite descrcarea potei de pe serverul central, iar modelul de lucru imple mentat 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). Si ncronizarea ntre cele dou cutii potale nu este prevzut explicit n cadrul protocolului 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. S erverul POP3 lucreaz pe maina pe care se afl cutia potal. Clientul POP3 se execut pe P C-ul utilizatorului. La apelul su, clientul POP3 face identificarea utilizatorulu i (numeparol), apoi legtura cu serverul POP3. Acesta acceseaz cutia potal a utilizato rului i transmite clientului noile scrisori aflate aici. POP3 folosete tot protoco lul TCP, ca i SMTP, dar este diferit de acesta. Sistemul care pstreaz cutia potal gzdu iete dou servere, unul SMTP i unul POP3. Serverul POP3 poate fi folosit i cu conexiu ni comutate (dial-up). 3. IMAP (Interactive Mail Access Protocol) definit n RFC 1 064, ajuns la versiunea 4. Se folosete pentru a se nltura deficienele constatate n PO P3. Acesta permite ca agentul utilizator s lucreze cu copii temporare ale mesajel or, 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 pent ru utilizatorii care nu au un punct fix de lucru, fiind adaptat pentru reele de ti p Intranet. 4. DMSP (Distributed Mail System Protocol) definit n RFC 1056; presup une existena mai multor cutii potale i permite transferul scrisorilor ctre o staie de lucru, dup care se deconecteaz. Dup reconectare, scrisorile sunt retransferate i si stemul este resincronizat. 15

FTP i pota electronic

Ambele protocoale au dou mari deficiene: autentificarea se face pe baza unei parol e care circul n clar prin reea iar mesajele aduse de la server sunt transferate n cl ar. Servicii de directoare: LDAP (Lightweight Directory Access Protocol) - proto col uor de acces la cataloage. Serviciul de directoare este folosit, n special, n l egtur cu sistemul de pot electronic deoarece i furnizeaz acestuia att adrese, ct i cate necesare pentru criptarea i semnarea mesajelor de pot. Se poate construi o age nd cu informaii despre persoanele implicate n sistemul de pot, printr-un serviciu cen tralizat de directoare i clieni LDAP (att Netscape, ct i Microsoft au adoptat LDAP). Transferul documentelor prin intermediul potei electronice: Prin facilitatea de a taare a documentelor la un mesaj de pot electronic este posibil transmiterea unui fiie r 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 standard ului MIME. Documentele binare sunt codificate conform standardului BASE64, care specific transformarea unei secvene de 3 caractere pe 8 bii ntr-o succesiune de 4 ca ractere care pot fi tiprite (litere, cifre, semne de punctuaie), reprezentate pe 6 bii. Tipul documentului ataat este indicat n antetul mesajului de pot electronic, fol osindu-se codificarea bazat pe tipurile MIME. Tipul documentului permite programe lor de pot electronic s lanseze n execuie programul care tie s vizualizeze documentul aat recepionat. La sistemele Unix, unde se utilizeaz programul mail pentru trimiter ea mesajelor, fierele se ataeaz cu comanda ~r nume_fi n corpul mesajulul. Implicit SM TP-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: MI ME (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 info rmaii pe lng cele clasice de tip text. Sistemul MIME a fost preluat i de Web prin pr otocolul HTTP. Din acest motiv, tipurile documentelor sunt cunoscute i sub numele de tipuri MIME. Identificatorul de tip este definit ca fiind compus dintr-un ti p i un subtip, cele dou componente fiind separate printr-un slash. Este o completa re a RFC 822, introducnd alte 5 antete de mesaje: MIME-version, Content-Descripti on, Content-ID, Content-Tranfer-Encoding, Content-Type, precum i 7 tipuri (text, image, application, message, multiplart etc.) cu mai multe subtipuri. Tipuri/sub tipuri MIME Tabel 2.1 Tip/subtip MIME text/plain Tipul informaiei asociate Inform aie 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 im age/jpeg Document de tip imagine codificat conform standardului JPEG application/ octet- Fiier binar, cu tip nespecificat, care trebuie tratat ca un stream ir de oc tei video/mpeg Film codificat conform standardului MPEG Pentru transferul mesajel or n siguran, exist dou variante: Criptarea canalului de comunicaie se face prin inte mediul unui protocol sigur, de tipul SSL (Secure Sockets Layer). Practic, nainte de nceperea "discuiei" dintre agentul utilizatorului i cutia potal, se stabilete un ca nal 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 e lectronic folosit pe scar larg care este capabil s stabileasc conexiuni SSL este Nets cape 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 at problema transferului sigur al mesajului, ct i pe cea a verificrii identitii emitorul i. De exemplu, soluia de tip PGP poate fi implementat cu succes n medii Windows i Un ix, asigurnd integrare cu toi clienii de pot electronic. Problema autentificrii n sig n a utilizatorului cu cutia potal poate fi rezolvat att prin criptarea canalului de co municaie, ct i prin extensiile aduse celor dou protocoale care gestioneaz pota electro nic de la client. Astfel, protocolul IMAP prezint un mod opional de criptare doar p e perioada autentificrii, iar firma Microsoft a adus unele extensii protocolului POP3 (mecanismul SPA - Secure POP Authentication) care au fost nglobate n clienii d e mail Outlook i Outlook Express. Din pcate, aceste soluii nu au un sprijin importa nt 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 f tp 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.r o. Citii-v e-mail-ul folosind un client de e-mail configurat pentru POP3, IMAP, ap oi folosii un browser. 5. Citii-v pota de pe infocib folosind un client de e-mail su b 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 fu rnizeaz 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, W indows. Conine negocieri, fiiere log extinse. CERN - pentru platforme Unix, VMS. C onine instrumente de cutare i faciliti de autorizare a accesului. NCSA - pentru platf orme Unix; server public. IIS (Internet Information Server) pentru WinNT Server, XP. PWS (Personal Information Server) pentru Win.95/NT Workstation. 3.2 IIS Ser verul de Web IIS (Internet Information Server) are urmtoarele caracteristici: Int ernet 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 P ersonal Web Server pentru Win 9x i NT Workstation, disponibil cu Option Pack 4. E lemente 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 uti lizatorul; 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 crip tri pe 128 bii; Stocare de certificate de autentificare integrat cu Windwos Crypto API; gestionarea se realizeaz prin componenta Windows Certificate Manager; Autent ificare rezumat (digest authentification) permite autentificarea utilizatorilor prin servere proxy i ziduri de protecie; include autentificare Windows pentru acce sul la paginile deWeb; Kerberos v5 protocol de autentificare integrat n Win2000 c are permite trecerea elementelor de autentificare printr-o reea de calculatoare W indows; Fortezza standard de securitate al guvernului USA; asigur confidenialitate a, integritatea, autentificarea i controlul mesajelor, componentelor i sistemelor; Administrare: crearea de servere virtuale (porturi diferite, IP acelai sau difer it) i directoare virtuale (alias utile cnd paginile pe Web se gsesc pe mai multe dr ive-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 di stan prin Web; fiecare site suport i un Operator, cu drepturi restrnse; administrare centralizat prin MMC (Microsoft Management Console) include programe numite snap-i ns; 20

Reele de calculatoare

protecia aplicaiilor IIS ofer 3 niveluri: Low (IIS Processes) aplicaiile ruleaz ai process ca i serviciile Web (Inetinfo.exe) Medium (pooled) - implicit; aplicaiil e ruleaz ntr-o alt instan a DLLHost.exe; High (Isolated) - aplicaiile ruleaz n proces iferite de serviciile Web (DLLHost.exe). 3.3 Exerciii IIS 1. Verificai existena IIS: port, director, proces, serviciu; 2. Ve rificai dac exist c:\Inetpub (directorul rdcin al IIS), respectiv directoarele wwwroot , ftproot pentru serverele de web i ftp; 3. Verificai dac ruleaz InetInfo.exe (serve rul ca serviciu) (CRTLALT-DEL -> Task Manager -> Processes) (Control Panel-> Ser vices); 4. Lansai pagina implicit a IIS (http://localhost/); 21

Servere Web

5. Lansai Computer Management; 6. Vizualizai setrile implicite ale serverului impli cit 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 se tat ca root pentru documentele serverului. Verificai site-ul; 8. Modificati fiieru l 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 (netsta t a n|more) 10. Din consola de management, creai un director virtual cu numele dumn eavoastr n site-ul creat anterior i dai drept de browse pe acel director (n afar de ce le implicite). Refacei paii cu fiierul default; 11. Din Sharing, creai un alt direct or virtual n acelai site, dup care testai-l. Facei n aa fel nct accesul s se realiz baz de cont de Windows cu parol. 3.4 NCSA Crearea unui server http utilizarea un s erver deja existent, de exemplu www.infocib.ase.ro crearea propriul server: gata compilat sau sub form de surse. Caracteristici NCSA: Codul surs al versiunii http d_1.3 are apte directoare: cgi-bin, conf, icons, logs, cgi-src, src, support, din tre care ultimele trei conin fiiere "makefile", prin care se compileaz produsul. Ut ilizatorul trebuie s modifice anumii parametri doar din makefile-ul directorului s rc. 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/Mak efile i /src/config.h (la versiunea de la NCSA); modificarea fiierelor de configur are cu parametri specifici sistemului; configurare n timpul rulrii. Principalele t ipuri de fiiere i directivele care trebuie configurate sunt: httpd.conf fiierul de configurare al serverului conine informaii referitoare la: ServerType tipul server ului (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 fo rma 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/htd ocs; UserDirectory directorul ce specific un subdirector pe care trebuie sa-l cre eze utilizatorii pentru html-urile proprii. Pentru ca userii s poat scrie n acel di rector trebuie comutat de pe "disable", care este implicit, i pus pe "enable". Re direct creeaz un document virtual pe server; Alias creeaz o legtur ntre un document/ irector virtual de pe serverul de Web i un document/director de pe calculatorul s erver; 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 r ead 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/htt pd ErrorLog logs/error_log TransferLog logs/httpd.pid ServerName www.infocib.ase .ro DocumentRoot /usr/local/etc/httpd/htdocs UserDir Web DirectoryIndex index.ht ml FancyIndexing on DefaultIcon /icons/unknown.xbm ReadmeName README HeaderName HEADER IndexIgnore */.??* *~ *# */HEADER* */README* AccessFileName .hhtaccess De faultType text/plain Alias /icons/ /usr/local/etc/httpd/icons Alias /info/ /usr/ local/etc/httpd/htdocs/info Alias /document/ /u/pub/document ScriptAlias /cgi-bi n/ /usr/local/etc/httpd/cgi-bin Configurarea accesului pentru directorul htdocs, ce conine documentaie: < Directory/usr/local/etc/httpd/htdocs> OptionsIndexes Fol lowSymLinks 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 ex ecut ca un daemon clasic. El ateapt sosirea conexiunilor i servete cererile. La fieca re 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 ca re 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 d e comand, de exemplu /etc/rc.local i ruleaz continuu ca un daemon de "sendmail". Pe ntru aceasta trebuie introdus comanda: "/usr/etc/httpd &" n rc.local sau rc; Se po ate 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 s e utilizeaz modul stand-alone, pe sistemele Unix, doar root-ul poate rula httpd p e porturi mai mici dect 1024, care sunt privilegiate, ceilali useri avnd acces de l a 1024 n sus. Un exemplu de form de rulare a serverului, poate fi: httpd [-d direc tor_iniial_server] [-f fisier_de_configurare][-v] unde -v este opiunea pentru afiar ea versiunii de server http. Forma general de lansare a unui server httpd este ur mtoarea: httpd [-opt -opt -opt ...] [director] unde opt poate fi: -r fiier_de_Conf igurare, cel folosit drept fiier de configurare. n cazul n care nu se pune, implici t se consider /etc/httpd.conf; -p port, portul de ascultare. Porturile mai mici d ect 1024 sunt privilegiate. Fr acest argument se consider c se ruleaz ca "inetd" i uti izeaz stdin i stdout drept canale de comunicaie; -l log_fiier nregistreaz cererile de conectare; -restart, restarteaz un httpd ce deja ruleaz, rencrcnd fiierele de configur are i redeschiznd fiierul de login (log file); -gc_only, doar pentru opiunea de "pro xy"; -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 posibili tatea vizualizrii (navigrii) coninutului directorilor, acetia devenind nite documente hipertext. Acest opiune se poate seta i din directiva de configurare DirAccess; -d n nu permite vizualizarea directorilor; o aciune de ncercare a accesului n director i 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 director ii navigabili care conin un fiier README, incluznd textul fiierului n partea superioa r a directorului, nainte de listarea coninului directorului (se seteaz directiva de configurare DirReadme); -db, idem, dar pune textul fiierului README n partea infer ioar. Aceste dou opiuni pot fi combinate cu -dy, -dys, -dty, etc; -dr dezactiveaz in cluderea fiierului README. Exemplu: httpd -r /usr/etc/httpd.conf -p 80 este un se rver standalone ce ruleaz pe portul 80, cu fiierul de configurare de mai sus. Dac s e 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 ins talare, se recomand rularea cu opiunea -v i citirea FAQ-ului corespunztor, consultar ea documentaiei referitoare la bug-uri. 3.5 Apache Caracteristici: Versiuni sub S O 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 config urare (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 c rearea 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 server e 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 sof tware? (httpd help) Vizualizai structura de directoare i fiierele de configurare pen tru fiecare n parte. Care este denumirea directorului pe care trebuie s-l creai n Ho me Directory, pentru a accesa paginile voastre de Web cu serverul de Web NCSA. D ar pentru Apache? Transferai pe server fiierele .html. Creai n home directory un dir ector Web, n care mutai fiierele .html create n seminarul anterior. Dai dreptul de ci tire i execuie pentru toat lumea directorului Web, cu toate subdirectoarele sale. A ccesai 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 Windo ws 1. Download kit: ftp://ecomm.ase.ro/ /apache2_0.43-win32-x86no_ssl.msi 2. Doc umentaie: --------,,-----------/apachedocs.pdf 3. Instalare: a. alegei varianta cu stom 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 po rtul 8080 ocupat. d. Verificai dac programul apache este pornit ca proces sau serv iciu. e. Vizualizai structura de directori ai serverului apache. Intrai n directoru l 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 se rverul 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 exis tena serviciului. k. Punei n cgi-bin un script care s v afieze un contor pe pagina voa str. l. Verificai noul server de Web de pe acest port (apache t; netstat -a). m. Do cumentai-v n legtur cu porturile unui sistem, care sunt ocupate, pe care le putei folo si ca utilizator privilegiat i ca utilizator obinuit. n. Creai un nou fiier de confi gurare (alt nume, alt port). Pornii serverul cu acest fiier nou i testai-l (f file_na me). o. Intrai cu cont i parol pe directorul vostru virtual. i. Editai httpd.conf, m odificai denumirea fiierelor .htaccess, .htpasswd: <Directory "F:\users"> AllowOve rride AuthConfig Options None Order allow,deny Allow from all </Directory> ii. A tenie 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 </Fi les> iii. Creai n directorul vostru fiierul htaccess: AuthType Basic AuthName "Carm en's Area!" AuthUserFile "F:/users/carmen/htpasswd" require user cs iv. Creai fiie rul 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 tr ebuie editat). Trebuie pus i modulul LoadModule vhost_alias_module modules /mod_vh ost_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, deo arece 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 adres ele IP asociate adreselor fizice ale plcilor de reea (MAC) pentru computerele din LAN Afieaz configuraia TCP/IP curent ipconfig Afieaz statistici i conexiuni pentru pro ocolul NetBT nbtstat Afieaz statistici i conexiuni pentru protocolul TCP/IP netstat Afieaz sau modific tabela de rutare local route hostname Afieaz numele computerului V erific ruta pn la un computer aflat la distan tracert Verific dac routerele de pe drum l pn la un computer aflat pathping la distan funcioneaz corect i n acelai timp detec ierderile de pachete de date rezultate n urma trecerii prin diferite noduri ale r eelei Toate aceste utilitare sunt executate din linia de comand. Pentru informaii r eferitoare la modul n care se folosesc, cu excepia hostname i tracert, deschidei o f ereastr de comand (Start->Programs->Accessories>Command Prompt), i tastai comanda, u rmat de parametrul/?. Dac informaiile afiate ncap pe mai mult de un ecran i nu le pute urmri, folosii parametrul |more. Pentru a folosi utilitarul hostname, trebuie doa r s tastai numele acestuia i s apsai tasta Enter. Va fi afiat numele computerului. Pen ru informaii referitoare la modul de folosire a utilitarului tracert, tastai numel e 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 fii ere ntre un computer pe care ruleaz Windows i un server FTP (de exemplu, Windows 20 00 Server). Faciliteaz transferul bidirecional de fiiere ntre un computer pe care ru leaz 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. Co piaz 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 compu ter 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 ipconfi g 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 folos it, dar n dreptul mtii de subreea se va trece 0.0.0.0. Dac Windows nu a putut obine o dres IP de la un server DHCP, va fi afiat adresa alocat prin tehnologia APIPA. Utili tarul ping Ping este un instrument folosit pentru testarea conexiunii TCP/IP ntre computerul dumneavoastr i unul aflat la distan. Ping transmite pachetele utiliznd IC MP 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 Liste az numele de login, numele complet, numele terminalului, precum i alte caracterist ici. 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 tilizatori Utilitarul netstat Comanda netstat este folosit pentru a extrage o ser ie de informaii cum ar fi tabelele de rutare, coneciile active, fluxuri. Vom preze nta 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 a u fost autoconfigurate -m Afieaz modul de utilizare a memoriei -r Afieaz tabelele de rutare -p nume_protocol Limiteaz informaiile la un protocol anume Utilitarul trac eroute Este utilizat pentru a identifica traseul ce trebuie urmat de un pachet p entru a ajunge la destinaie. Aceast comand lucreaz utiliznd un cmp special TTL (time t o 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 exi st 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 A P -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 tr ebuie urmai pentru verificare configuraiei computerului i pentru testarea conexiuni lor la computere aflate la distan, ce implic eventual i existena unor routere. ipconf ig Folosii utilitarul ipconfig pentru a verifica dac a fost iniializat configuraia TC P/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 ad resa 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 u tilitarul ping cu adresa IP a gateway-ului implicit (aceasta poate fi aflat folos ind comanda ipconfig) pentru a verifica dac gateway-ul implicit este operaional i c omputerul 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 inte rmediul unui router. n general, dac acest ultim pas reuete, atunci ceilali pai sunt in utili. Totui, n cazul n care nu reuete, va trebuie s urmai succesiunea de pai de mai 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 AR P (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 comp uterul aflat la distan. Ex: Secvena ping ecomm.ase.ro arp -a va duce la afiarea adre sei MAC a serverului ecomm. tracert adresa_IP_a_computerului_de_la_distan afieaz nod urile de reea prin care trece un pachet de date pn s ajung la computerul destinaie. pa thping adresa_IP_a_computerului_de_la_distan reprezint o combinaie ntre comenzile tra cert 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 comput er aflat la distan, n cazul n care este cunoscut adresa IP a acestuia. netstat a afi 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 adresar e, pentru a identifica reelele i nodurile n cadrul acestora. Adresele Internet folo site 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 (I Pv6), n care adresele se reprezint pe 128 octei. n vederea unei alocri sistematice, a dresele 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 adre s 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 c orespunztor, 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 ultim ii 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 d stincia ntre adrese publice i adrese private. Se numesc adrese publice cele care su nt obinute de la autoritile de alocare a adreselor i sunt rutate n Internet. Aceste a drese au caracter de unicitate, n sensul c nici o adres nu este multiplu alocat. Dat orit 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 o rganizaie, 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 - 17 2.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. Sintet izarea 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 patr u octei, prin care se poate identifica n mod unic un nod (interfa). Numr pe 32 bii, sc ris de obicei n format zecimal, grupat pe cei patru octei, care identific o reea. Nu mrul 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 gru pat pe cei patru octei, utilizat pentru a adresa toate nodurile (interfeele) din c adrul unei reele de calculatoare. Poriunea din adres corespunztoare gazdei conine num ai valori binare de 1. Numr pe 32 bii scris de obicei n format zecimal grupat pe ce i patru octei, utilizat pentru a calcula adresa de reea prin efectuarea unui i logi c ntre masc i o adres IP. Adres de broadcast Masc de reea Prin definiie, toate nodurile dintr-o reea posed aceeai valoare numeric pentru poriune a de reea din adresele IP. Cealalt parte a adresei IP se numete zon de gazd (host). A ceasta difer de la un nod (interfa) la altul. Adresele de clasa A sunt folosite n ree lele cu un numr foarte mare de noduri aflate sub aceeai autoritate (companii trans naionale, 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 identi fica nodurile (interfeele). Prin urmare unei reele de clas A i se pot asigna 224 no duri. 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 ca racteristici. Caracteristici adrese Clas Numr de octei-bii utilizai pentru a identifi ca reeaua Numr de octei-bii utilizai pentru a identifica interfaa Tabel 5.2 Numrul de drese 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 f iecare reea. Adresele de reea sunt similare adreselor IP obinuite ns nu sunt asignabile unei inte rfee 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 identi fic o reea de clas B, iar 200.4.3.0 identific o reea de clas C. Tabelul 3 sintetizeaz spectele referitoare la adresele de reea. Marje adrese IP Clas Valoarea primului o ctet 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 est e folosit ca adres de broadcast, iar adresa 127.0.0.0 este folosit ca adres de loopb ack. 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 e reea standard Clas A B C Numr de octei-bii ce identific reeaua 1 (8) 2 (16) 3 (24) T bel 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 re 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 i dentific reeaua sunt definii prin tipul clasei, cei de host sunt definii de ctre masc a de reea folosit, iar cei de subreea sunt obinui prin preluarea biilor rmai. De exem o masc de reea de forma: 255.255.255.240, utilizat n cadrul unei reele de clas C, det ermin un numr de patru bii de host. 8 24-x x Reea Sub-reea Host 16 16-x x Reea Sub-reea Host 24 8-x x Reea Sub-reea Host Figura 5.1 Structurarea unei adrese de IP Putem face o serie de observaii privito are la cele discutate: Dou adrese IP unice din aceeai reea au valori identice pentr u 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 s ubreea diferind doar prin partea de host. Dou adrese IP unice aflate n subreele dife rite dintr-o reea de clas A, B sau C au aceeai valoare n partea de reea i difer prin p rtea de subreea. Dac nu s-ar utiliza mprirea n subreele, cel mai mic grup de hosturi c 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 adr esa IP 134.141.7.11 i masca de reea 255.255.255.0 s se specifice care este adresa c are identific subreeaua. Adresa este de clasa B; am evideniat ngroat biii care identif ic subreeaua. Adresa: Masca de reea: Rezultatul: 134.141.7.11 1000 0110 1000 1101 0 000 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, ia asca este 255.255.255.0, rezult c nu se utilizeaz mprirea n subreele. Adresa: Masca d eea: 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 0 111 0000 0111 3. Avnd adresa IP 134.141.7.11 i masca de reea 255.255.255.0 s se specifice care est e 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 ce a 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.2 55.248 s se specifice care sunt adresele IP asignabile n aceast subreea. Adresa de s ubreea este 140.1.1.0, iar cea de broadcast este 140.1.1.7. Adresele de IP asigna bile se gsesc n intervalul: 140.1.1.1 - 140.1.1.6. 6. Avnd adresa IP 10.5.118.3 i ma sca de reea 255.255.255.0 s se specifice care sunt subreelele ce se pot forma. Adre sa este de clas A. Acest lucru implic faptul c octeii 2 i 3 sunt n ntregime rezervai tru 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 seri ale. 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. Arhitect ura 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 pen tru a acoperi necesarul de 200 adrese. Numrul de subreele necesar este 100, ceea c e 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 subreeau ct i grupului de bii care identific hostul. Acest bit a fost marcat cu X. Exist dou po sibiliti de masc de reea: 255.255.254.0 sau 255.255.255.0. Vom continua pe primul mo del, 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 di n tabelul urmtor: Subreea Router A Ethernet Router B Ethernet Router C Ethernet Li nie serial A-B Linie serial A-C Linie serial C-B Masc de subreea 255.255.254.0 255.25 5.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 n tre ele prin intermediul mesajelor. Cnd o aplicaie trimite o cerere ctre nivelul tr ansport pentru a trimite un mesaj, protocolul folosit la acest nivel: mparte info rmaia n pachete; adaug un antet de pachet care include adresa destinaiei; trimite in formaia nivelului reea pentru procesare ulterioar. Transmisia i recepia datelor se re alizeaz prin intermediul unor porturi de pe server, care identific destinaia specif ic a mesajului. Nivelul transport este implementat n reelele TCP/IP prin intermediu l a dou protocoale: UDP (User Datagram Protocol) protocol datagram utilizator; TCP (Transmission Control Protocol) protocol de control al transmisiei. Caracterist ici UDP: Asigur servicii de tip datagram nivelului aplicaie; Nu este fiabil (nu asi gur certitudinea livrrii datagramelor, nici mecanismele de protecie la pierderea sa u 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 pr in numere ntregi pozitive i care au asociate nite cozi de mesaje prin care se trans mit 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; Destinatio n Port Number adresa portului destinaie; Length lungimea datagramei n bytes; Check sum suma de control asociat datagramei (folosete acelai algoritm ca la protocolul I P). Caracteristici TCP (Transmission Control Protocol): Este fiabil (asigur integ ritatea datelor transmise, mecanisme de protecie la pierderea sau duplicarea pach etelor, 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 an me interfaa socket. 6.2 Interfaa Socket Este o interfa ntre un program de aplicaie i serviciul de transpor t (este un standard de facto), fiind furnizat de o bibliotec socket sau de sistem ul de operare. Se folosete conceptul de descriptor, fiecare socket fiind tratat a semntor cu un fiier local. Acest descriptor este transmis aplicaiei la crearea socke t-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, localad dr, addrlen) listen(socket,queuesize) newsock = accept(socket, caddress, caddres slen) 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 conecta re 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(s ocket, buffer, length, flags) recvfrom(socket, buffer, length, flags, sndaddr, s addrlen) rcvmsg(socket, msgstruct, flags) Descriere transmite un mesaj transmite un mesaj folosind un socket neconectat primete un mesaj primete un mesaj pe un so cket 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 un ui flux de bytes; este identificat printr-un descriptor, asemntor cu cel pentru fii er realizeaz urmtoarele operaii elementare: conectarea la staia de la distan emiter datelor recepionarea datelor nchiderea unei conexiuni ataarea la un port ateptare ererilor de conexiune emise de staiile de la distan acceptarea cererilor de conexiu ne la portul local O aplicaie de reea include: un program client care creeaz un soc ket pentru a iniia o conexiune cu o aplicaie server un program server care ateapt pr eluarea cererilor clienilor Structura general folosit pentru lucrul cu socketuri es te: struct sockaddr { unsigned short sa_family; char sa_data[14]; //14 bytes pen tru 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 s tructura de mai sus se folosete o nou structur ajuttoare sockaddr_in. Structura sock addr este una generic (o putem privi ca o clas abstract) menit a stoca informaii de a dres pentru oricare tip de socketuri. Structura ajut la referirea facil a elementel or 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_fam ily corespunde cmpului sa_family din structura sockaddr; sin_port identific portul ; sin_addr identific adresa IP; sin_zero[8] se iniializeaz cu 0. Valorile articolel or sin_port i sin_addr trebuie s fie n forma big endian. Pentru acest lucru va treb ui s se fac conversia ntre formatul little endian (host order) i cel big endian (net work order). Pentru aceste conversii se vor utiliza funciile: htons() host to netw ork short htonl() host to network long ntohs() network to host short ntohl() netw o host long O alt funcie util de conversie este inet_addr(), care convertete adrese I P 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-endia atunci putem folosi funcia inet_ntoa(), astfel: printf ("%s", inet_ntoa(ina.sin_a ddr)); Vom prezenta un exemplu de iniializare a structurii sockaddr_in: struct so ckaddr_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_ad dr.sin_zero), ' \ 0 ' , 8 ) ; Funcia socket() creaz un socket i returneaz descriptor ul 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 ti p, int protocol); Parametrii funciei: Domeniul de comunicaie poate fi setat cu val ori de tipul AF_ceva, cum ar fi: AF_UNIX stabilete domeniul de comunicare local UN IX sau AF_INET utilizat pentru comunicaii ntre procese aflate pe aceeai main sau pe m aini diferite, folosind stiva de protocoale TCP/IP (domeniul Internet). Pentru ex emplele 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 ga i respective, denumit port. Tipul de socket utilizat: SOCK_STREAM (comunicarea s e va realiza full-duplex, sigur, orientat-conexiune prin flux de date) sau SOCK_DG RAM (fr conexiune prin datagrame). Se mai poate folosi i constanta SOCK_RAW care of er un acces la protocolul reea (protocolul IP), de nivel inferior. Protocol specif ic protocolul particular care va fi utilizat pentru transmisia datelor. Acesta po ate fi setat pe 0 pentru ca funcia s-i poat alege protocolul corect automat. De exempl u, pentru domeniul AF_INET i tipul SOCK_STREAM se va considera protocolul de tran sport 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 d e 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 convert i numele unui calculator n adresa IP; getprotobyname() pentru a converti numele u nui protocol n forma binar folosit de sockets; socket() pentru a crea un socket; co nnect() pentru a conecta socket-ul la un server; 48

Reele de calculatoare recv() (n mod repetat) pentru transferul tuturor datelor de la server (clientul n u 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 co nverti numele unui protocol n forma binar folosit de sockets; socket() pentru a cre a un socket; bind() pentru a specifica portul local pentru socket; listen() pent ru 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 trim ite date; close() pentru a nchide noul socket. Primitivele blocante folosite sunt accept, connect (3 way handshake) i gethostbyname (conectare cu un server de num e). Primitiva bind() asigneaz socketul la portul mainii la care, de exemplu, serve rul va asculta cereri de conexiune din partea clienilor. Prototipul funciei este u rmtorul: #include <sys/types.h> #include <sys/socket.h> int bind(int sockfd, stru ct sockaddr *my_addr, int addrlen); Parametri: sockfd este descriptorul de socke t my_addr este un pointer la structura ce conine informaii referitoare la adres add rlen 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(MYPO RT); // 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, (stru ct sockaddr *)&my_addr, sizeof (struct sockaddr)) ; ................. } Dup ataare a portului, serverul va trebui s atepte viitoarele conexiuni de la diveri clieni i s l e rezolve cererile. Pentru aceasta se utilizeaz primitiva listen() urmat apoi de a ccept(). Primitiva listen() are urmtoarea form: int listen(int sockfd, int backlog ); Parametri: sockfd este descriptorul de socket; backlog reprezint numrul maxim d e conecii permise n coada de ateptare. Primitiva accept() permite acceptarea propri u-zis a conexiunilor: int accept(int sockd, struct sockaddr *addr, socklen_t *add rlen); Apelul va returna un descriptor de socket corespunztor clientului a crui co nexiune a fost acceptat, stabilindu-se astfel un canal de comunicaie duplex ntre se rver i client. Acest nou descriptor va putea fi folosit pentru a trimite i recepion a date via reea prin mijlocitori precum send() sau write() i recv() sau read(). Pa rametri: sockfd este descriptorul de socket addr va conine informaii despre adresa IP i portul folosite de clientul conectat la server, addrlen stocheaz lungimea ac estei structuri. 50

Reele de calculatoare

Primitiva send() ntoarce numrul de octei transmii, care uneori difer de numrul de octe ce dorim s-i transmitem. Valoarea returnat este numrul de octei trimii n caz de succe s. Dac eueaz, este returnat -l, iar errno descrie eroarea. int send(int sockfd, con st 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 n umrul de octei recepionai. Valoarea returnat este numrul de octei primii n caz de su 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 sock et; msg reprezint o zon de memorie n care se vor copia datele recepionate; len repre zint mrimea acestor date n octei; flags este de obicei 0 sau setat la valoarea MSG_P EEK, dac datele recepionate trebuie reinute i dup ce sunt recepionate; Primitivele clo se() i shutdown() Primitiva close() va nchide conecia aferent descriptorului de sock et. Astfel se va bloca orice read() or write() ulterior, cel ce va ncerca acest l ucru va primi mesaj de eroare. Primitiva shutdown() permite un control superior al procesului de nchidere a socketurilor. Funcia are forma: int shutdown(int sockf d, int opt); Parametri: sockfd este descriptorul pentru socketul ce trebuie nchis ; opt poate lua valorile: 0 (interzice orice recepie ulterioar), 1 (interzice oric e 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 Comun icaie client-server UDP/IP n figura 6.2 este prezentat modul de comunicaie client-s erver 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 soc ket care va trata conexiunile cu clienii. Sunt pregtite structurile de date (socka ddr_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 se rver i client (sendto() i recvfrom()). Pot fi utilizate i primitivele generale send () i recv(). Se nchide socketul client (close()). Primitiva sento() este folosit pe ntru trimiterea datagramelor, ntoarce numrul de octei trimii i are urmtorul prototip: int sendto(int sockfd, const void *msg, int len, unsigned int flags, const struc t sockaddr *to, int tolen); 52

Reele de calculatoare

Parametrii funciei: sockfd este descriptorul de socket; msg reprezint o zon de memo rie n care se afl datele ce trebuie trimise; flags va fi iniializat cu 0 len reprez int lungimea datelor ce vor fi trimise; to reprezint un pointer la o structur de ti p sockaddr i conine adresa de IP i portul destinaiei; tolen va fi iniializat cu valoa rea 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; le n reprezint lungimea datelor primite; from reprezint un pointer la o structur de ti p sockaddr i conine adresa de IP i portul sursei; fromlen va fi iniializat cu valoar ea sizeof(struct sockaddr) 6.3 Exemplificri 1. S se construiasc un server i un clien t TCP/IP. n exemplu, serverul va pstra evidena numrului de clieni care au accesat res ursa 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 buf fer[32]; struct sockaddr_in client, server; /*adresele client, server*/ struct h ostent * srvinfo; int s, rc, namelen, ns; if(argc!= 2) { printf("Apel: %s port \ n", argv[0]); exit(1); } /*preia numele calculatorului local */ if(gethostname(b uffer, 32)) perror("Eroare la preluarea numelui serverului"); printf("Nume serve r: %s \n", buffer); /*preia informatiile despre configurarea hostului*/ if (!(sr vinfo=gethostbyname(buffer))) perror("Eroare la preluarea informatiilor despre s erver"); port=(unsigned short) atoi(argv[1]); /*Creeaza un socket*/ if ((s=socke t(AF_INET, SOCK_STREAM, 0)) <0) { perror("Eroare la creare socket"); exit(3); } /*Asociaz socketului o adres de server */ memset(&server, 0, sizeof(server)); serv er.sin_family = AF_INET; /*AF_UNIX, AF_INET*/ server.sin_port = htons(port); ser ver.sin_addr.s_addr = inet_addr("193.226.34.61"); /* adresa Internet locala */ i f ( 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); } /* R ecepioneaz mesajul de la client */ if(recv(ns, buffer, 32, 0) == -1) { perror ("Er oare la recepie"); exit(7); } /* Afieaz mesajul primit de la client */ printf("Mesa j recepionat de la client, pe TCP: %s\n", buffer); /*Trasmite confirmarea clientu lui */ if (send(ns, buffer, strlen(buffer), 0) <0) { perror("Eroare la transmisi e"); exit(8); } endhostent(); /* nchide sesiunea TCP/IP */ close(ns); close(s); e xit(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*/ s truct 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("Eroa re la preluarea numelui serverului"); exit(3); } printf("A preluat numele de ser ver.... \n"); port = (unsigned short)atoi(argv[2]); strcpy(buffer, "Mesaj transf erat 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_STREA M,0)) < 0) { perror("Eroare la creare socket"); exit(4); } printf("A creat socke t-ul....\n"); if (connect(s, &server, sizeof(server)) < 0) { perror("Eroare la o binerea conexiunii"); exit(5); } printf("A realizat conexiunea.....\n"); /* Trans mite mesajul serverului */ if (send(s, buffer, strlen(buffer), 0) < 0) { perror( "Eroare la transmisie"); exit(6); } printf("A transmis mesajul.....\n"); /* Conf irmare de la server */ if (recv(s, buffer, 32, 0) < 0) { perror("Eroare la recepi e"); exit(7); } printf("Confirmarea de la server a fost fcut.... \n"); close(s); e xit(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 <st dio.h> #include <errno.h> #include <netdb.h> main() { char buffer[32]; struct so ckaddr_in client, server; /*adresele client, server*/ int s, rc, namelen; /*Cree az un socket*/ if ((s=socket(AF_INET, SOCK_DGRAM, 0)) <0) { perror("Eroare la cre are socket"); exit(1); } printf("A creat socket-ul....\n"); /*Asociaz socketului o adres de server */ memset(&server, 0, sizeof(server)); server.sin_family = AF_I NET; /*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"); /* Determ in 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 asigna t 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 r ecepionat 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)); endhoste nt (); /* nchide sesiunea UDP/IP */ close(s); exit(0); } /* Modul CLIENT UDP */ / * Modul CLIENT UDP */ #include <sys/types.h> #include <sys/socket.h> #include <n etinet/in.h> #include <stdio.h> #include <errno.h> #include <netdb.h> main(int a rgc, 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) at oi(argv[1]); strcpy(buffer, "Mesaj transferat prin socket, pe UDP"); /*preia inf ormaiile 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("Er oare 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 n umr 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 cre az 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 <er ror.h> #include <string.h> #include <stdlib.h> #include <signal.h> /* portul fol osit */ const int PORT_SERVER = 9001; /* numarul maxim de clieni acceptai */ const int CLIENTI_MAXIM = 10; extern int errno; /* eroarea returnat */ int ds; /* desc riptor pentru server */ int dc; /* descriptor pentru client */ int nr = 0; /* nu mrul de clieni */ void semnal (int nr_semnal) /* funcia de tratare a semnalelor */ { if (nr_semnal == SIGCHLD) { wait (NULL); nr--; /* am pierdut un client */ retu rn; } } /* 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 (errn o); } 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 () { stru ct sockaddr_in server; /* tratm semnalele */ if (signal (SIGCHLD, semnal) == SIG_ ERR) { perror ("signal()") ; exit (errno); } if (signal (SIGPIPE, SIG_IGN) == SI G_ERR) { perror ("signal()"); exit (errno); } /* crem socket-ul */ if ((ds = sock et (AF_INET, SOCK_STREAM, 0)) == -1) { perror ("socket() ") ; return errno; } /* pregtim structurile de date */ bzero (&server, sizeof (server)); server.sin_fami ly = AF_INET; server.sin_port = htons (PORT_SERVER); server.sin.addr.s_addr = ht onl (INADDR_ANY); /* atam la port */ if (bind (ds, &server, sizeof (server)) == -1 ) { perror ("bind()"); return errno; } if (listen (ds, 5) == -1) { perror ("list en() ") ; 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: pe rror ("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 ved ere obinerii de informaii necesare pentru fundamentarea procesului decizional. Glo balizarea la nivel microeconomic a activitii a transformat treptat modelul de prel ucare client-server specific primelor aplicaii de reea, ntr-un model bazat pe nivel uri de servicii, cel mai simplu incluznd nivelul de acces la date, nivelul logici i aplicaiei i nivelul de prezentare prin care aplicaia este accesat de ctre utilizato ri. .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 Framewo rk; un mediu de dezvoltare care ofer suport pentru mai multe limbaje de programar e standardizate sau proprietate Microsoft Visual Studio .NET; sistemul de operar e care ofer suport pentru aplicaiile distribuite dezvoltate pe platforma .NET Fram ework Windows Server. Viziunea care a stat la baza iniiativei .NET a avut n vedere asigurarea urmtoarelor deziderate: programarea independent de limbaj; robusteea i s calabilitatea aplicaiilor pe ansamblu; securitatea integrat; uurina implementrii; dis tribuirea prelucrrilor; suportul pentru standarde deschise; mentenabilitatea; fac iliti de depanare avansate. .NET este similar platformei J2EE; ambele constituie o abordare structurat pentru crearea aplicaiilor distribuite, oferind limbaje compil ate n cod intermediar mpreun cu o bogat colecie de interfee de programare pentru dezvo ltarea 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 d a porta i alte limbaje pe platforma JVM, ele au rmas doar n sfera limbajelor forma le, 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 p e mai multe sisteme de operare. Spre deosebire de J2EE, platforma .NET ofer supor t pentru mai multe limbaje de programare compilate n Microsoft Intermediate Langu age (MSIL), plecnd de la ideea: o singur platform pe care pot rula mai multe limbaj e. Firma Sun Microsystems a dezvoltat Java att ca limbaj, ct i platform pentru dezvo ltarea aplicaiilor distribuite, existnd n prezent trei ediii ale platformei Java: J2 SE (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 specific aii standardizate i nu un produs, permind dezvoltatorilor s creeze aplicaii distribuit e pe mai multe niveluri. Diferenele fundamentale ntre J2EE i .NET se concretizeaz n: suportul pentru sisteme de operare; suportul pentru limbajele de programare; met oda de execuie. nc de la nceput Java a fost proiectat s lucreze cu un numr mare de sis eme de operare, rulnd n prezent pe platforme: Windows, UNIX, Linux, MacOS, BeOS. S pre deosebire de J2EE, .NET a fost gndit s ruleze doar pe Windows, existnd ns ncercri portare a mediului de execuie i pe Linux, proiectele de tip Open Source, precum M ono i Rotor oferind suport pentru majoritatea interfeelor de programare din .NET. Pentru implementarea aplicaiilor distribuite este nevoie de servere de aplicaii pe ntru publicarea componentelor care nglobeaz logica aplicaiei. Paltforma .NET ofer II S 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 Intermedia te 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 implemen tri 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, pen tru a putea gzdui servicii Web, necesit, ca i IIS-ul, un mediu de procesare a mesaj elor SOAP i de gestiune a componentelor de serviciu. n J2EE exist mai multe impleme ntri SOAP, precum Axis i SOAP de la Apache, Web Services Developement Kit (WSDK) d e la Sun i omonimul su de la IBM, sau Glue, iniial dezvoltat de The Mind Electric, a ctualmente oferit de WebMethods. Pentru accesul la date, aplicaiile distribuite fa c apel la servere de baze de date relaionale, prin interfee de programare specific e. Platform .NET ofer ActiveX Database Objects .NET (ADO.NET), prin intermediul cr eia 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 P ostGre SQL. Platforma J2EE dispune de Java Database Connectivity (JDBC), o inter fa 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, M S SQL Server 2000, MSDE, MS Access, MySQL, PostGre SQL etc. Pentru clieni Web est e nevoie de servere Web cu suport dedicat tehnologiilor specifice, astfel: Platf orma .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 M icrosoft SQL Server 2000 reduce vizibil timpul necesar pentru a construi soluii b azate pe Web, de afaceri i de depozitare a datelor, automatiznd n acelai timp sarcin ile 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. Cara cteristicile pentru a aduce pe Web aplicaiile noi i existente sunt incluse cu supo rt XML i acces HTTP. Alte caracteristici includ capacitatea de cutare de text n baz ele de date i formate de documente cunoscute; auto-gestionare i adaptare dinamic, s ervicii de analiz integrate i migrarea i transformarea simplificat a datelor. Proced urile stocate sunt o colecie de declaraii precompilate stocate sub un nume i proces ate 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 creea z o aplicaie cu SQL Server, limbajul de programare Transact-SQL (TSQL) este interf aa 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 programel or i crearea aplicaiilor care s trimit comezile ctre SQL Server i s proceseze rezultat le; prin stocarea programelor ca proceduri stocate n SQL Server i crearea aplicaiil or care s execute aceste proceduri i s proceseze rezultatele. Procedurile stocate d in SQL Server sunt similare procedurilor din alte limbaje deoarece pot s: primeas c parametri introdui i s returneze valori multiple sub forma parametrilor de ieire; c onin declaraii care s ndeplineasc operaiuni n baza de date, inclusiv s cheme alte pr ri. 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 sto cate 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, stoca t n baza de date i chemat ori de cte ori este nevoie n program. Procedurile stocate po t 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 sto cate 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 folosi t dup ce este executat pentru prima dat; permit reducerea traficului pe reea: o operai une 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 stoc ate din spaiul rolului conexiunii deschise, astfel: this.sqlCommand = new SqlCommand(); this.sqlCommand.CommandText = "dbo.[getProdu cts]"; this.sqlCommand.CommandType = CommandType.StoredProcedure; this.sqlComman d.Connection = this.sqlConnection; this.sqlCommand.Parameters.Add(new SqlParamet er("@RETURN_VALUE", SqlDbType.Int, 4, ParameterDirection.ReturnValue, false, ((b yte)(0)), ((byte)(0)), "", DataRowVersion.Current, null)); n cazul unei proceduri stocate care selecteaz date din mai multe tabele prin inter mediul unui adapter trebuie mapate coleciile extrase din baz peste tabelele DataSe t-ului destinaie: this.sqlDataAdapter.SelectCommand = this.sqlCommand; this.sqlDataAdapter.TableMa ppings.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 * * * * F ROM 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 orig ine 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; pu blic short Version; } package tutorials.database.storedprocedure; import java.io .Serializable; public class Student implements Serializable { public int Student Id; public String FirstName; public String LastName; public short Version; } Accesor package tutorials.database.storedprocedure; import java.sql.CallableStatement; i mport java.sql.Connection; import java.sql.DriverManager; import java.sql.Result Set; import java.sql.SQLException; import java.util.Vector; public class DataAcc essor { private Connection connection; public void open(String host, int port, S tring database, String user, String password) throws SQLException, ClassNotFound Exception { Class.ForName("com.microsoft.jdbc.sqlserver.SQLServerDri ver"); this .connection = DriverManager.getConnection( 70

Reele de calculatoare "jdbc:microsoft:sqlserver://" + host + ":" + port + ";Datab aseName=" + database + ";User="+ user + ";Password=" + password + ";"); } public void close() throws SQLException { this.connection.close(); } public Gr oup[] getGroups() throws SQLException { Vector vector = new Vector(); CallableSt atement statement = this.connection.prepareCall("call GetGroups()"); ResultSet r esults = statement.executeQuery(); while(results != null && results.next()) { Gr oup group = new Group(); group.GroupId = results.getInt(1); group.Name = results .getString(2); group.Version = results.getShort(3); } return (Group[]) vector.to Array(); } public Student[] getStudentsByGroup(int groupId) throws SQLException { CallableStatement statement = this.connection.prepareCall("call GetStudentsByG roup(?)"); 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); stude nt.Version = results.getShort(4); vector.add(student); } return (Student[]) vect or.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 conexiun e activ sau deconectate. n privina suportului nativ pentru conectarea la diferite s ervere, platforma .NET ofer suport pentru SQL Server chiar de la versiunea 1.0 cru ia i s-a 71

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE adugat suportul pentru Oracle n versiunea 1.1, restul serverelor fiind suportate p rin 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 cuno scut 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 legare a direct la metodele acestora. Prin intermediul signaturii comune a metodelor int erfeei ADO.NET pe care fiecare clas de acces o implementeaz, este totui posibil defin irea 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 e ste necesar virtualizarea accesului la baza de date prin implementarea unui mecan ism de fabric de obiecte care s asigure legarea implementrii specifice bazei de dat e 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 Ope n(string host, string database, string user, string password); System.Data.DataS et ExecuteQuery(string statement, string table); object ExecuteScalar(string sta tement); 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 pro vider-ului ADO.NET specific: Clas de acces la SQL Server 2000 namespace Tutorials.Database { internal class SQLServerDatabaseConnection: IData baseConnection { private System.Data.SqlClient.SqlConnection connection; private string database; public SQLServerDatabaseConnection() { } public void Open(stri ng 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.Sql Client.SqlDataAdapter(statement, this.connection).Fill(dataSet, table); return d ataSet; } 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: IDatabas eConnection { private System.Data.OracleClient.OracleConnection connection; priv ate string database; public OracleDatabaseConnection() { } public void Open(stri ng 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.conne ction.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, t his.connection).Fill(dataSet, table); return dataSet; } public object ExecuteSca lar(string statement) { return new System.Data.OracleClient.OracleCommand(statem ent, this.connection).ExecuteScalar(); } public int ExecuteNonQuery(string state ment) { return new System.Data.OracleClient.OracleCommand(statement, this.connec tion).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: IDatabase Connection { private ByteFX.Data.MySqlClient.MySqlConnection connection; private string database; 75

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE public MySQLDatab aseConnection() { } public void Open(string host, string database, string user, string password) { this.database = database; this.connection = new ByteFX.Data.M ySqlClient.MySqlConnection(" data source = "+host+";database = "+database+";user id = "+user+";password = "+password); this.connection.Open(); } public System.D ata.DataSet ExecuteQuery(string statement,string table) { System.Data.DataSet da taSet=new System.Data.DataSet(); new ByteFX.Data.MySqlClient.MySqlDataAdapter(st atement,this.connec tion).Fill(dataSet, table); return dataSet; } public object ExecuteScalar(string statement) { return new ByteFX.Data.MySqlClient.MySqlComman d(statement, this.connection).ExecuteScalar(); } public int ExecuteNonQuery(stri ng statement) { return new ByteFX.Data.MySqlClient.MySqlCommand(statement, this. connection).ExecuteNonQuery(); } public void Close() { if(this.connection != nul l) 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 acce s 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, SqlSe rver, MySql} public class DatabaseConnection { private IDatabaseConnection datab aseConnection = null; public void Open(Providers provider, string host, string d atabase, string user, string password) { switch(provider) { case Providers.Oracl e: this.databaseConnection = new OracleDatabaseConnection(); break; case Provide rs.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 Sy stem.Data.DataSet ExecuteQuery(string statement, string table) { 77

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE return this.datab aseConnection != null ? this.databaseConnection.ExecuteQuery(statement, table) : null; } public object ExecuteScalar(string statement) { return this.databaseCon nection != null ? this.databaseConnection.ExecuteScalar(statement) : null; } pub lic int ExecuteNonQuery(string statement) { return this.databaseConnection != nu ll ? this.databaseConnection.ExecuteNonQuery(statement) : -1; } public void Clos e() { if(this.databaseConnection != null) { this.databaseConnection.Close(); thi s.databaseConnection = null; } } public string Provider { get { return this.data baseConnection != null ? this.databaseConnection.Provider : null; } } public boo l 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 baz e de date. Totui, crearea unei conexiuni este specific fiecrui provider prin driver ul 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 metodelo r apelnd interfaa JDBC. 78

Reele de calculatoare se definete o clas abstract care va conine metoda abstract de conectare i implementare a 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 passwor d; 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.s ql.SQLException { this.connection.close(); } public java.sql.ResultSet executeQu ery(String statement) throws java.sql.SQLException { return(this.connection.crea teStatement()).executeQuery(s tatement); } public boolean executeInsert(String s tatement) 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.SQLExcep tion { return(this.connection.createStatement()).execute(statem ent); } } pentru conectarea la un anumit server se extinde clasa abstract prin implementare a metodei de conectare; spre exemplu, pentru conectarea la MySQL, clasa derivat v a arta astfel: public class MySQLDatabaseConnection extends DatabaseConnection { public MySQLDa tabaseConnection() { } 79

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE public void conne ct(String host, int port, String database, String user, String password) trows j ava.lang.ClassNotFoundException, java.sql.SQLException { this.host = host; this. port = port; this.database = database; this.user = user; this.password = passwor d; Class.forName("org.gjt.mm.mysql.Driver"); this.connection = java.sql.DriverMa nager.getConnection("jdbc:mysql://" + this.host + ":" + this.port + "/" + this.d atabase + "?user=" + this.user + "&password=" + this.password); } } pentru conectarea la SQL Server clasa derivat va arta astfel: public class SQLServerDatabaseConnection extends DatabaseConnection { public SQL ServerDatabaseConnection() { } 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 = dat abase; this.user = user; this.password = password; Class.forName("com.microsoft. jdbc.sqlserver.SQLServerDri ver"); this.connection = java.sql.DriverManager.getC onnection("jdbc:microsoft:sqlserver ://" + this.host+ ":" + this.port + ";Databa seName=" + this.database + ";User=" + this.user + ";Password=" + this.password + ";"); } } n ambele cazuri metoda de conectare face apel la clasele punii JDBC pentru serveru l de baze de date respectiv, astfel nct pentru deschiderea conexiunii prin JDBC es te 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 ape larea unui obiect prin .NET Remoting presupune urmtoarele aciuni: se definete inter faa 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 Date OfBirth; } } Interfa serviciu namespace Tutorials.Remoting.Common { public interface ICustomerManager { Custom er[] GetCustomers(); } } se construiete un proiect n care se implementeaz interfaa de apel: using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Chann els; using System.Runtime.Remoting.Channels.Http; using Tutorials.Remoting.Commo n; namespace Tutorials.Remoting.Service { public class CustomerManager : Marshal ByRefObject, ICustomerManager { 81

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE public CustomerMa nager() { Console.WriteLine("CustomerManager.constructor: Object created"); } pu blic Customer[] GetCustomers() { Customer[] customers = new Customer[2]; custome rs[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 = "Cucul escu"; customers[1].DateOfBirth = new DateTime(1979, 1, 1); return customers; } } } pentru publicarea serviciului se poate opta pentru un context Web pe IIS, un ser viciu de platform sau o aplicaiei consol de test: using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Chann els; using System.Runtime.Remoting.Channels.Http; using Tutorials.Remoting.Servi ce; namespace Tutorials.Remoting.Server { class Server { [STAThread] static void Main(string[] args) { HttpChannel channel = new HttpChannel(1979); ChannelServi ces.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 se rverul de obiecte, prin intermediul crei apeleaz metodele obiectului: using System; using System.Runtime.Remoting; using System.Runtime.Remoting.Chann els.Http; using System.Runtime.Remoting.Channels; using Tutorials.Remoting.Commo n; namespace Tutorials.Remoting.Client { class Client { [STAThread] static void Main(string[] args) { HttpChannel channel = new HttpChannel(); ChannelServices.R egisterChannel(channel); ICustomerManager manager = (ICustomerManager) Activator .GetObject( typeof(ICustomerManager), "http://localhost:1979/CustomerManager.soa p"); Console.WriteLine("Client.Main(): Reference to CustomerManager acquired"); Customer[] customers = manager.GetCustomers(); foreach(Customer customer in cust omers) 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 In vocation): Interfa de metode apelabile la distan package tutorials.remoting; import java.rmi.Remote; import java.rmi.RemoteExcept ion; public interface IPrimeNumbers extends Remote { public int[] getPrimeNumber s(int n) throws RemoteException; } Implementarea interfeei de metode apelabile la distan package tutorials.remoting; import java.rmi.RemoteException; import java.rmi.ser ver.UnicastRemoteObject; public class PrimeNumbers extends UnicastRemoteObject i mplements IPrimeNumbers { public PrimeNumbers() throws RemoteException { super() ; } public int[] getPrimeNumbers(int n) throws RemoteException { boolean[] isNot Prime = new boolean[n + 1]; int found = 0; for(int i = 2; i <= n - 1; i++) if(is NotPrime[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.RMISecurityM anager; public class Server { public static void main(String[] args) { System.se tSecurityManager(new RMISecurityManager()); try { PrimeNumbers primeNumbers = ne w 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 = (PrimeNumbe rs) Naming.lookup("rmi://remoting/PrimeNumbersService"); int n = args.length == 1 ? Integer.parseInt(args[0]) : 1000; int[] numbers = primeNumbers.getPrimeNumbe rs(n); String message = ""; for(int i = 0; i < numbers.length; i++) message += ( message.length() > 0 ? ", " : "") + numbers[i]; System.out.println(message); } c atch(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 da te complexe este necesar serializarea / deserializarea lor XML; mecanismul poate fi implementat declarativ prin intermediul atributelor sau imperativ prin instru ciuni care apeleaz un obiect de tipul XmlWriter, respectiv XmlReader: Clas C# seria lizat XML n mod declarativ using System; using System.Xml.Serialization; namespace Tutorials.ComplexTypeSer vices.Service { [XmlRoot(Namespace = "http://aris.ase.ro/schemas")] public class Contact { [XmlElement("FirstName")] public string FirstName; [XmlElement("LastN ame")] public string LastName; [XmlElement("Email")] public string Email; } } Clas Java serializat XML n mod declarativ package tutorials.services.complextype; import java.io.Serializable; public clas s Contact implements Serializable { public String FirstName; public String LastN ame; public String Email; } serviciul expune o metod care ntoarce un vector de obiecte serializate XML: Servic iu C# using System; using System.Collections; using System.ComponentModel; 86

Reele de calculatoare using System.Data; using System.Diagnostics; using System.W eb; using System.Web.Services; namespace Tutorials.ComplexTypeServices.Service { [WebService(Namespace = "http://aris.ase.ro/schemas")] public class ContactServ ice : System.Web.Services.WebService { public ContactService() { InitializeCompo nent(); } #region Component Designer generated code private IContainer component s = null; private void InitializeComponent() { } protected override void Dispose ( bool disposing ) { if(disposing && components != null) { components.Dispose(); } base.Dispose(disposing); } #endregion [WebMethod] public Contact[] GetContact s() { Contact[] contacts = new Contact[2]; contacts[0] = new Contact(); contacts [0].FirstName = "Iulian"; contacts[0].LastName = "Ilie-Nemedi"; contacts[0].Emai l = "iulian.nemedi@ase.ro"; contacts[1] = new Contact(); contacts[1].FirstName = "Radu"; contacts[1].LastName = "Constantinescu"; contacts[1].Email = "radu.cons tantinescu@ase.ro"; return contacts; } } } ntr-un proiect Java dezvoltat cu ajutorul mediului Eclipse, se copiaz structura un ei 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 cl asele ntr-un director surs, respectiv ntr-un pachet Java n care se definete un tip co mplex care va fi ntors de metodele serviciului Web; pentru a putea fi serializat XML acesta trebuie s implementeze interfaa java.io.Serializable; se definete interf aa serviciului Web: Interfaa serviciului Java package tutorials.services.complextype; public interface IContactService { publi c Contact[] getContacts(); } se implementeaz interfaa prin intermediul clasei serviciului; n producie metodele se rviciului fac apel la o baz de date pentru extragerea informaiilor: Serviciu Java package tutorials.services.complextype; public class ContactService implements I ContactService { public Contact[] getContacts() { Contact[] contacts = new Conta ct[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 = "Con stantinescu"; contacts[1].Email = "radu.constantinescu@ase.ro"; return contacts; } } clientul .NET apeleaz serviciul prin intermediul unui proxy care conine clase pent ru 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.Contac t[] contacts = new ContactProxy.ContactService().GetContacts(); for(int i = 0; i < contacts.Length; i++) Console.WriteLine("Contact:\n" + "\tFirst Name: " + con tacts[i].FirstName + "\n" + "\tLast Name: " + contacts[i].LastName + "\n" + "\tE mail: " + contacts[i].Email + "\n"); } } } clientul Java are nevoie de o clas pentru reprezentarea obiectului complex deseri alizat; pentru construirea acesteia platforma Glue Professional ofer utilitarul s chema2java; apelarea din Java presupune importarea pachetelui cu definirea tipul ui 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; impor t electric.registry.RegistryException; public class Client { public static void main(String[] args) throws RegistryException { IContactService proxy = (IContact Service) Registry.bind(args[0], IContactService.class); Contact[] contacts = pro xy.getContacts(); for(int i = 0; i < contacts.length; i++) System.out.println("C ontact:\n" + "\tFirst Name: " + contacts[i].FirstName + "\n" + "\tLast Name: " + contacts[i].LastName + "\n" + 89

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE "\tEmail: " + con tacts[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 mec anismelor de serializare / deserializare ale containerelor de servicii Web, port abilitatea unui singur tip elementar, de exemplu String, permite traversarea pla tformei de ctre un obiect complex, n ultim instan programatorul putnd folosi serializa rea i deserializarea String a obiectelor; 7.2.3 Apelarea serviciilor Web n mod asi ncron Utilitarul wsdl.exe genereaz metode pentru apelarea serviciului att n mod sin cron, ct asincron. Pentru apelarea asincron se genereaz cte o pereche de metode Begi n_Apel_Metod i End_Apel_Metod. Apelarea asincron a unui serviciu Web presupune iniier ea apelului prin execuia metodei Begin care nregistreaz o funcie delegat callback ce va fi apelat la obinerea rspunsului de la metoda serviciului. presupunem un servic iu Web a crui execuie poate dura un timp mai ndelungat, avnd o metod care determin toa te numerele prime pn la un numr dat ca parametru: Serviciu C# using System; using System.Collections; using System.ComponentModel; using Syste m.Data; using System.Diagnostics; using System.Web; using System.Web.Services; n amespace Tutorials.AsyncCallService.Service { [WebService(Namespace = "http://ar is.ase.ro/schemas")] public class PrimeNumbersService : System.Web.Services.WebS ervice { public PrimeNumbersService() { InitializeComponent(); } 90

Reele de calculatoare #region Component Designer generated code private IContaine r components = null; private void InitializeComponent() { } protected override v oid Dispose( bool disposing ) { if(disposing && components != null) { components .Dispose(); } base.Dispose(disposing); } #endregion [WebMethod] public int[] Get PrimeNumbers(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(typeo f(int)); } } } Interfaa serviciului Java package tutorials.services.asynccall; public interface IPrimeNumbersService { pu blic int[] getPrimeNumbers(int n); } se implementeaz interfaa printr-o clas serviciu: Serviciu Java package tutorials.services.asynccall; public class PrimeNumbersService implement s IPrimeNumbersService { public int[] getPrimeNumbers(int n) { boolean[] isNotPr ime = 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 numb ers; } } se public serviciul pe un context Glue prin JMS (Java Messaging Services): Aplicai e gazd pentru serviciu Java package tutorials.services.asynccall; import electric.registry.Registry; import electric.registry.RegistryException; import electric.registry.Registry; import e lectric.server.jms.JMS; public class AsyncServer { public static void main(Strin g[] arguments) throws Exception { JMS.startup("jms:///AsyncCallService"); Regist ry.publish("PrimeNumbersService", new PrimeNumbersService()); } } clientul .NET conine o metod care va fi apelat n mod asincron la primirea rezultatel or apelului ctre metoda serviciului Web: Metoda clientului C# public void LoadComplete(IAsyncResult result) { this.Cursor = Cursors.Default; t his.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 componen tei 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 interme diul aceleai interfee ca i pentru apelurile sincrone, utiliznd ns alt URL pentru servi ciu, 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 ma in(String[] args) throws RegistryException { String url = "jms://AsyncCallServic e/PrimeNumbersService.wsdl"; IPrimeNumbersService proxy = (IPrimeNumbersService) Registry.bind(url, IPrimeNumbersService.class); int n = args.length == 1 ? Inte ger.parseInt(args[0]) : 1000; int[] numbers = proxy.getPrimeNumbers(n); String m essage = ""; 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 comp onent de serviciu, spre exemplu care necesit accesul tranzacional la o baz de date p entru a nregistra o comand; tipurile de date i interfaa de apel de la distan trebuie o rganizate ntr-o bibliotec referit att de serviciu care implementeaz interfaa, ct i de ientul 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("Qu antity", typeof(int))] public int Quentity; } } Interfaa de apel namespace Tutorials.ServicedComponents.Common { public interface IDeliveryServic e { bool PlaceOrder(Order order); } } se implementeaz interfaa de aplel prin intermediul unei componente de serviciu ges tionat tranzacional n COM+: Component de serviciu using System; using System.EnterpriseServices; 94

Reele de calculatoare namespace Tutorials.ServicedComponents { [Transaction(Trans actionOption.Required)] [JustInTimeActivation(true)] public class DeliveryServic e : ServicedComponent, Common.IDeliveryService { #region IDeliveryService Member s [AutoComplete] public bool PlaceOrder(Common.Order order) { return DateTime.No w.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.ServicedC omponents.DeliveryService,Tutorials.S ervicedComponents" objectUri="/ServicedCom ponents/DeliveryService.SOAP"/> </service> </application> </system.runtime.remot ing> </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. clie ntul 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.Chann els; using System.Runtime.Remoting.Channels.Http; namespace Tutorials.ServicedCo mponents.Client { class Client { [STAThread] static void Main(string[] args) { t ry { HttpChannel channel = new HttpChannel(); ChannelServices.RegisterChannel(ch annel); Common.IDeliveryService service = (Common.IDeliveryService) Activator.Ge tObject(typeof(Common.IDeliveryService), "http://localhost/ServicedComponents/De liveryService.SOAP"); Common.Order order = new Common.Order(); order.Product = " A Product"; order.Quentity = 1; Console.WriteLine(service.PlaceOrder(order) ? "Y our order has been placed." : "Your order has been rejected."); } catch(Exceptio n exception) { Console.WriteLine(exception.ToString()); } } } } Componentele EJB gzduite de containere EJB ale serverelor de aplicaii Java Enterpr ise sunt apelabile prin Remote Method Invocation (RMI). Pentru a putea apela o c omponent EJB prin intermediul protocolului SOAP, platformele Java de servicii Web intercepteaz mesajele SOAP/HTTP ale clientului pe care le ruteaz conform descript orilor 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 RM I. 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 c lienii 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 dir ectorului apptemplate ntr-un director cu numele aplicaiei; descriptorul aplicaiei W eb, fiierul web.xml, aflat n subdirectorul de resurse WEB-INF, conine maparea servl et-urilor contextului curent, printre care se remarc servlet-ul glue-SOAP, respon sabil cu rutarea mesajelor SOAP ctre procesorul serviciului: <servlet> <servlet-name>glue-SOAP</servlet-name> <servletclass>electric.server.h ttp.ServletServer</servlet-class> <init-param> <param-name>httpRegistryRoot</par am-name> <param-value>/</param-value> </init-param> <load-on-startup>1</load-onstartup> </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 f iierul sample.xml; n cazul publicrii unei componente EJB ca serviciu Web fiierul des criptor are urmtoare form: <?xml version='1.0'?> <service> <constructor> <class>electric.service.ejb.Statel essSessionBeanService</class > <args> <contextFactory>org.jnp.interfaces.NamingC ontextFactory</conte xtFactory> 97

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE <url>jnp://localh ost:1099</url> <jndiName>ejb/Exchange</jndiName> <homeInterfaceName>tutorials.ej bstaff.interfaces.ExchangeHome< /homeInterfaceName> </args> </constructor> </ser vice> descriptorul precizeaz tipul de Bean publicat, contextul JNDI al componentei EJB pe serverul de aplicaii i interfaa Remote de apel; se construiete arhiva aplicaiei We b 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/depl oy) pentru apelarea dintr-un client Java este necesar includerea unei interfee sim ilare interfeei Remote a componentei EJB: Interfa de apel la client package tutorials.ejbstaff.client; public interface IExchange { public double ge tRate(String county1, String country2); } Client Java package tutorials.ejbstaff.client; import electric.registry.Registry; public cla ss Client { public static void main(String[] args) { try { String url = args[0]; IExchange exchange = (IExchange) Registry.bind(url, IExchange.class); double ra te = exchange.getRate("usa", "japan"); System.out.println("usa/japan exchange ra te = " + rate); } catch(Exception exception) { System.out.println(exception.toSt ring()); } } } 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 liv reaz 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 ser viciului este numele fiierului descriptor .xml din subdirectorul services al dire ctorului de resurse al aplicaiei Web (WEBINF): Client J# package Tutorials.EjbStaff.NETClient; public class Client { /** @attribute Syste m.STAThread() */ public static void main(String[] args) { EjbService.Exchange ex change = 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 s erviciu virtual nu are ataat o implementare static n sensul consacrat; n schimb se of er posibilitatea nregistrrii unor clase care s trateze la momentul apelului mesajele SOAP destinate serviciului virtual. Aceast legare poate fi de nivel nalt sau de n ivel 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 g etRate(String country1, String country2); } 99

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE se ofer cel puin o implementare pentru interfaa serviciu. Arhitectura serviciilor v irtuale High-Level are la baz mecanismul fabricii de obiecte. Spre deosebire de s erviciile Web obinuite care ataeaz o singur implementare unei interfee publicate, ser viciile virtuale permit ataarea la momentul apelului a implementrii adecvate conte xtului 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 descripto rul aplicaiei sau n aplicaia gazd, ci ntr-o clas special care se folosete de mecanism de Reflection pentru dispecerizarea apelurilor metodelor serviciului ctre obiectu l ce-l deservete la momentul apelului: package tutorials.services.virtual; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class ExchangeHandler implements Invocat ionHandler { private IExchange exchange = new Exchange(); public Object invoke(O bject proxy, Method method, Object[] args) throws Throwable { return method.invo ke(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 d e 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 electri c.registry.Registry; import electric.server.http.HTTP; import electric.service.v irtual.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 Exchan geHandler(); VirtualService exchange = new VirtualService(IExchange.class, handl er); Context context = new Context(); Registry.publish("exchange", exchange, con text); } } clientul apeleaz serviciul virtual similar apelrii unuia obinuit, prin legarea la U RL-ul descriptorului WSDL i conversia obiectului proxy obinut la tipul interfeei se rviciului, prin care ulterior poate apela metodele acestuia, indiferent de clasa care le implementeaz pe server: package tutorials.services.virtual; import electric.registry.Registry; public cl ass ExchangeInvoke { public static void main(String[] args) throws Exception { S tring url = "http://localhost:8004/glue/exchange.wsdl"; IExchange exchange = (IE xchange) Registry.bind(url, IExchange.class); double rate = exchange.getRate("us a", "japan"); System.out.println("usa/japan exchange rate = " + rate); } } Implementarea unui serviciu virtual Low-Level un serviciu virtual de tip Low-Lev el implementeaz interfaa electric.SOAP.ISOAPHandler pentru a rspunde apelurilor SOA P ctre metodele serviciului: package tutorials.services.virtual; import java.rmi.RemoteException; import elec tric.xml.Element; import electric.xml.XPath; import electric.xml.io.encoded.Enco dedWriter; import electric.SOAP.ISOAPHandler; import electric.SOAP.SOAPMessage; 101

Implementarea aplicaiilor distribuite pe platformele .NET i J2EE import electric.u til.Context; public class ExchangeSOAPHandler implements ISOAPHandler { static f inal XPath country1 = new XPath("getRate/[1]"); static final XPath country2 = ne w XPath("getRate/[2]"); public SOAPMessage handle(SOAPMessage request, Context c ontext) throws RemoteException, SecurityException { String arg0 = request.getBod y().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", "getRate Response"); 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 el ectric.server.http.HTTP; import electric.SOAP.virtual.VirtualSOAPHandler; public class ExchangeSOAPPublish { public static void main(String[] args) throws Excep tion { HTTP.startup("http://localhost:8004/glue"); ExchangeHandler invokeHandler = new ExchangeHandler(); ExchangeSOAPHandler SOAPHandler = new ExchangeSOAPHand ler(); VirtualSOAPHandler exchange = new VirtualSOAPHandler(IExchange.class, inv okeHandler, SOAPHandler); Registry.publish("exchange", exchange); } } 102

Reele de calculatoare apelarea unui serviciu virtual de tip Low-Level este similar apelrii oricrui servic iu Web XML, clientul netiind detaliile implementrii serviciului. 7.2.6 Autentifica rea 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 autent ificare: IIS: Internet Information Server ofer urmtoare tipuri de autentificri: Ano nymous Basic Authentification Digest Authentification Integrated Windows Authent ification (NTLM sau Kerberos) ASP.NET: introduce dou noi mecanisme de autentifica re: Forms: dezvoltatorul creeaz o pagin prin care se cere utilizatorului s-i introdu c informaiile de identificare. Pe baza unei proceduri de validare a datelor introd use se decide dac este autentificat sau nu. Passport: autentificarea utilizatorul ui se face cu ajutorul unei tere pri; pentru detalii despre cum anume se poate impl ementa acest mecanism de autentificare vezi www.passport.com Antete SOAP persona lizate: prin care dezvoltatorul i implementeaz propriul mecanism de autentificare. De exemplu, informaiile despre utilizator s fie trimise sub form de parametri la me toda serviciului web. Etapele autentificrii de tip antete SOAP personalizate: cre area unui antet SOAP prin derivarea unei clase din SOAPHeader coninnd credeniale cr iptate; crearea i nregistrarea n web.config a unui modul HTTP care s implementeze me toda Init i evenimentele Register ale interfeei IHttpModule; tratarea evenimentulu i 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 apli caiei 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 p rin intermediul atributelor PrincipalPermission asociat metodelor expuse de serv iciu Web. Autorizarea presupune acordarea drepturilor corespunztoare rolului juca t 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 serv er, fiind compatibil cu majoritatea platformelor care utilizeaz autentificarea de tip HTTP. n varianta Professional, GLUE include suport pentru integrarea cu stand ardul JAAS, care permite autentificarea bazat pe sistemul drepturilor de acces LD AP/NT. Noiunile fundamentale pentru implementarea autentificrii pe platfoma GLUE s unt: Principal, entitate asociat identitii utilizatorului; Role, colecie de drepturi de acces asociat unei identiti a utilizatorilor autentificai; Permission, o aciune c are poate fi executat de un utilizator avnd un asociat un anumit rol; Realm, o col ecie de informaii viznd identitatea utilizatorului, rolul asociat i permisiunile afe rente; Guard, o constrngere care utilizeaz o colecie Realm pentru a verifica c un ut ilizator autentificat are dreptul s execute o anumit aciune. Pentru impementarea au tentificrii 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 decl arat n fiierele de configurare, astfel: ProxyContext context = new ProxyContext(); context.setAuthUser("denumire_rol"); context.setAuthPassword("parol"); ISample sample = (ISample) Registry.bind(ur_wsd ll, ISample.class, context); 7.3 Nivelul de prezentare 7.3.1 Construirea unei imagini ntr-o pagin ASP.NET Pentr u exemplificare vom considera o pagin ASP.NET care afieaz ca rezultat o imagine ext ras 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" In herits="Tutorials.AspNet.RoomImage" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4 .0 Transitional//EN" > <html> <head> <title>RoomImage</title> <meta name="GENERA TOR" Content="Microsoft Visual Studio .NET 7.1"> <meta name="CODE_LANGUAGE" Cont ent="C#"> <meta name=vs_defaultClientScript content="JavaScript"> <meta name=vs_ targetSchema content="http://schemas.microsoft.com/intellisense/ie5"> </head> <b ody MS_POSITIONING="GridLayout"> <form id="ImageForm" method="post" runat="serve r"> </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 We b prin obiecte de forma Request, Response, Session, Context etc; punctul de intr are n program este handler-ului evenimentului Load al paginii, n acest caz funcia P age_Load; Clasa paginii using System; using System.Collections; using System.ComponentModel; using Syste m.Data; using System.Drawing; using System.Web; using System.Web.SessionState; u sing System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlCon trols; using System.IO; namespace Tutorials.AspNet { public class RoomImage : Sy stem.Web.UI.Page { private void Page_Load(object sender, System.EventArgs e) { i f(this.Request["RoomId"]!=null) { this.Response.ContentType = "image/jpg"; Admin istrator.AdministratorService service = new Administrator.AdministratorService() ; byte[] image = service.GetRoomImageData(int.Parse(this.Request["RoomId"])); if (image == null) { FileStream fileStream = new FileStream(this.Server.MapPath("tm p/admin_no_image.jpg"), FileMode.Open); image = new byte[new FileInfo(this.Serve r.MapPath("tmp/admin_no_image.jpg")).Length ]; fileStream.Read(image, 0, image.L ength); fileStream.Close(); } 106

Reele de calculatoare this.Response.OutputStream.Write(image, 0, image.Length); } } #region Web Form D esigner generated code override protected void OnInit(EventArgs e) { InitializeC omponent(); 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 s uplineasc deficienele arhitectuiri CGI legate de gestiunea proceselor i firelor de execuie, precum i de securitate, avnd urmtoarele caracteristici funcionale: pune la d ispoziia programatorului obiecte pentru accesarea interfeei server-ului Web cum ar fi HttpServletRequest, HttpServletResponse etc., organizate n pachetele javax.se rvlet i javax.servlet.http; rspunsul generat la ieire devine sursa paginii HTML, as tfel nct un servlet nu separ procesrile i coninutul rezultat de formatarea acestuia; b inarele unui servlet trebuie publicate n subdirectorul WEBINF/classes al unui con text Web; pentru a putea fi accesat, servletului i se asociaz un URL prin interme diul fiierului de configurare web.xml sau cu ajutorul meta-tag-ului comentariu @w eb.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.nami ng.Context; import javax.naming.InitialContext; import javax.rmi.PortableRemoteO bject; import javax.servlet.ServletConfig; import javax.servlet.ServletException ; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRe quest; import javax.servlet.http.HttpServletResponse; import tutorial.interfaces .Fibo; import tutorial.interfaces.FiboHome; /** * @web.servlet name="Compute" di splay-name="Computation Servlet" * description="Servlet that compute Fibonacci s uite" * * @web.servlet-mapping url-pattern="/Compute" * * @web.ejb-ref name="ejb /Fibo" type="Session" * home="tutorial.interfaces.FiboHome" * remote="tutorial.i nterfaces.Fibo" description="Reference to the * Fibo EJB" * * @jboss.ejb-ref-jnd i ref-name="ejb/Fibo" jndiname="ejb/Fibo" */ public class ComputeServlet extends HttpServlet { private FiboHome home; public ComputeServlet() { super(); } publi c void init(ServletConfig config) throws ServletException { try { Context contex t = new InitialContext(); Object ref = context.lookup("java:/comp/env/ejb/Fibo") ; home = (FiboHome) PortableRemoteObject.narrow(ref, FiboHome.class); } catch (E xception 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 = res ponse.getWriter(); out.println("<html><head><title>"); out.println("Fibonaci Com putation"); out.println("</title></head>"); out.println("<body>"); out.println(" <h1>"); out.println("Fibonaci Computation"); out.println("</h1>"); try { Fibo be an = 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); o ut.println(" : "); out.println(result[i]); } out.println("</p>"); } catch(Except ion e) { out.println(e.getMessage()); e.printStackTrace(out); } finally { out.pr intln("</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 urmtoar ele caracteristici: permite intercalarea de cod procesat pe server cu formatri HT ML; la momentul primei cereri o pagin JSP este translatat ntr-un servlet de ctre ser verul de aplicaii, care este apoi compilat n cod de octei i interpretat; pentru oric e alt cerere se compar data salvrii paginii JSP cu data fiierului binar generat, ver ificndu-se astfel dac este necesar translatarea i recompilarea paginii; Principiul s eparrii procesrilor de formatarea rezultatelor este cel mai bine exemplificat n sta ndarduol JSP 2.0 de tehnologia Custom Tags. Pentru implementarea unui Custom Tag este necesar scrierea urmtoarelor componente: o clas tag handler: reprezint o clas J ava care precizeaz modul n care tag-ul produce rezultat HTML; extinde clasa TagSup port sau BodyTagSupport i implementeaz interfaa Tag din pachetul javax.servlet.jsp. tagext, fiind publicat n contextul aplicaiei mpreun cu celelalte clase i componente Be an ale acesteia; un fiier descriptor al bibliotecii de tag-uri: descrie n format X ML numele, atributele i handler-ele tag-urilor, fiind publicat mpreun cu paginile J SP sau pe o anumit adres URL dac aparine altui context dect cel al aplicaiei Web curen te; fiierele JSP: import biblioteca de tag-uri prin intermediul fiierului descripto r, asociindu-i un prefix de tag pentru a putea utiliza tag-uri ale acesteia n cod ul 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 simp lu, fr imbricri de tip corp de tag; 110

Reele de calculatoare codul este translatat n servlet la momentul primei cereri a paginii JSP, genernd a poi rspuns HTML prin execuie pentru fiecare cerere n parte. Custom Tag fr imbricare package tutorials.customtags; import java.io.IOException; import java.util.Rando m; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.TagSuppor t; public class SimpleRandomTag extends TagSupport { protected int length; publi c 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 antet ul 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 p recizeaz numele tag-ului curent; nodul tagclass indic numele clasei handler califi cat cu pachetul acesteia; nodul info conine o scurt descriere a tag-ului curent. D escriptor pentru biblioteca de tag-uri custom <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE taglib PUBLIC "-//Sun Mic rosystems, 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>tutoria ls.customtags.SimpleRandomTag</tagclass> <info>Outputs a random integer.</info> </tag> </taglib> Utilizarea unui tag dintr-o bibliotec ntr-o pagin JSP presupune: se import bibliotec a 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> <titl e>JSP Page</title> </head> <body bgcolor="#FFFFFF"> <mytags:simpleRandom/> </bod y> </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 at ribut 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 { p ublic void setLength(int length) { this.length = length; } } Descriptor pentru un Custom Tag cu atribute <tag> <name>random</name> <tagclass>tutorials.customtags.RandomTag</tagclass> <a ttribute> <name>length</name> <required>false</required> <rtexprvalue>false</rte xprvalue> </attribute> </tag>

7.4 Interoperabilitatea platformelor .NET i J2EE Pe piaa platformelor software pen tru 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 teo ria avantajului comparativ evideniaz necesitatea cooperrii celor mai bune tehnologi i pentru fiecare nivel n parte. Interoperabilitatea celor dou platforme este neces ar din urmtoarele considerente practice: eterogenitatea platformelor hardware i sof tware existente n mediul de ntreprindere; controlul total este ineficient; specifi cul aplicaiei trebuie avut n vedere la alegerea unei platforme; ca rezultat, major itatea companiilor combin tehnologiile; la baza oricrui demers de combinare a plat formelor 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 atuu ri: interfaa client adaptat i optimizat pentru platforma Windows, folosit de majorita tea utilizatorilor finali ai produselor informatice de ntreprindere; ofer suport e xtins pentru dispozitive mobile i protocoale dedicate gen WAP; se integreaz cu sui ta 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 alt de scalabilitate; este mai mentenabil dect .NET; are un raport calitate / pre s uperior, oferind soluii fiabile. Aceast abordare nu este ntotdeauna cea optim. Se po t imagina trei scenarii de interoperabilitate plauzibile: punte RMI .NET Remotin g: 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 de zavantaje se remarc complexitatea ridicat, necesitnd convertoare de protocol, propr ietatea obiectelor COM+ pe platforma .NET precum i dependena de versiunea obiectel or. apelul prin cozi de mesaje: prezint avantajul cuplrii slabe, permind comunicarea intra i inter-niveluri, n condiiile existenei unui suport extins pentru tranzacii i s ecuritate; ca principal dezavantaj se nscrie absena operaiilor sincrone, introducndu -se penalizri temporare semnificative pentru sincronizare, alturi de posibile neaj unsuri 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 4 8 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 c lient 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 component e ca serviciu WEB ................................................. 7.2.5. Servi cii WEB virtuale ............................................................... ............................. 7.2.6. Autentificarea i autorizarea accesului ..... ...................................................... 7.3.1. Construirea unei i magini ntr-o pagin ASP.NET ............................................. 7.3.2. Ap elarea 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 ncrone, fr restricii de tip Firewall sau conversii de protocoale de comunicaie; pn n p ezent are totui dezavantajul implementrii pariale a standardelor pentru securitate, dar mai ales pentru tranzacii. Dezvoltarea modelului GXA (Global XML Web Service s Architecture) intenioneaz s nlture aceste neajunsuri prin protocoale de tipul WS-Se curity, WS-Attachement sau WS-Routing. 115

Bibliografie 1. 2. 3. 4. 5. BURAGA, S. CIOBANU, G. CRAWFORD W., KAPLAN, J. GULZAR, N., GANESH AN, 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 A pplication 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, Edi tura Economic, 2002; Arhitectura reelelor de calculatoare, Bucureti, Editura Econmi c, 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 P rint, 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.N ET Providers, JDBC Drivers http://www.mysql.com Sun: J2SDK, J2EE, JWSDP http://java.sun.com WebMethods: Glue http://www.webmetho ds.com 117

S-ar putea să vă placă și