Programare distribuită în Internet: metode şi aplicaţii

 

Florian Mircea Boian

 

Editura Albastră, grupul Microinformatica

 

Cluj, 1997

 

C U P R I N S

 

 

 

0. Introducere.......................

1. Modele de comunicaţie în reţele.......

1.1. Fixarea unei scurte terminologii.................

1.2. Abordare stratificată; protocoale

1.2.1. Exemplul comunicării între filozofi..................

1.2.2. Protocol şi familie de protocoale

1.2.3. Modelul OSI...........

1.2.3.1. Structura modelului.........

1.2.3.2. Relaţia OSI cu unele protocoale concrete.............

1.2.4. Independenţa între nivele de protocoale................

1.3. Concepte şi tehnici folosite în comunicaţii...............

1.3.1. Precizări de noi termeni................

1.3.2. Incapsulare, multiplexare, fragmentare, comutare................

1.3.2.1. Incapsulare şi dezîncapsulare

1.3.2.2. Multiplexare şi demultiplexare.

1.3.2.3. Fragmentare şi reasamblare.....

1.3.2.4. Comutare de pachete...........

1.3.3. Conexiuni, adrese, asocieri, rutări.......

1.3.3.1. Servicii orientate conexiune şi servicii fără conexiune.........

1.3.3.2. Secvenţiere, controlul erorilor, buffering........

1.3.3.3. Asocieri şi rutări...........

1.4. Familia de protocoale TCP/IP...

1.4.1. Un scurt istoric................

1.4.2. Structura pachetului TCP/IP...

1.4.2.1. Nivelul legăturii de date...........

1.4.2.2. Nivelul reţea..

1.4.2.3. Nivelul transport.........

1.4.2.4. Nivelul proces

1.5. Adrese internet şi convenţii de adresare.

1.5.1. Generalităţi privind coordonarea adresării................

1.5.2. Adrese IP şi clase de adrese....

1.5.2.1. Structura unei adrese IP; clase...........

1.5.2.2. Subreţele şi măşti de reţea..

1.5.2.3. Adrese speciale...........

1.5.2.4. Corespondenţa adrese IP - hosturi...........

1.5.3. Adrese Internet; servere de domenii..

1.5.3.1. Sistemul de adresare în Internet...........

1.5.3.2. Mecanismul serverelor de nume (DNS)

1.5.3.3. Specificarea adreselor Web (URL)

2. Sisteme distribuite şi algoritmi distribuiţi..

2.1. Sisteme distribuite...............

2.1.1. Ce este un sistem distribuit?................

2.1.2. Caracteristici ale sistemelor distribuite................

2.1.3. Diferenţe între sisteme LAN şi WAN.....

2.1.4. Topologii de conexiuni: avantaje şi dezavantaje................

2.1.4.1. Conexiuni complete...........

2.1.4.2. Conexiuni parţiale...........

2.1.4.3. Reţele ierarhice...........

2.1.4.4. Reţele stea...

2.1.4.5. Topologie inel

2.1.4.6. Legări prin magistrală.........

2.1.5. Resurse distribuite în sisteme de operare................

2.1.5.1. Sisteme de operare în reţea...........

2.1.5.2. Sisteme de operare distribuite.........

2.2. Algoritmi distribuiţi

2.2.1. Comparaţie între algoritmii distribuiţi şi cei centralizaţi................

2.2.2. Exemplu: comunicarea unui mesaj......

2.2.2.1. Comunicaţie sigură într-un mediu nesigur?...........

2.2.2.2. O conversaţie dintr-un mesaj.

2.2.2.3. O conversaţie din două mesaje

2.2.2.4. O conversaţie cu trei mesaje

2.2.2.5. Câte mesaje şi de ce?

2.2.3. Modele formale de algoritmi distribuiţi

2.2.3.1. Sistem de tranziţii...........

2.2.3.2. Algoritmi distribuiţi..........

2.2.3.3. Sisteme cu transmitere asincronă de mesaje

2.2.3.4. Sisteme cu transmitere sincronă de mesaje

2.3. Modelul client / server....

2.3.1. În ce constă?................

2.3.2. Clasificarea serverelor................

2.3.3. Servere concurente; prevenire zombie....

2.3.3.1. Schema de funcţionare a unui server concurent.......

2.3.3.2. Evitarea proceselor “zombie”; stilul System V........

2.3.3.3. Evitarea proceselor “zombie”; stilul BSD...

2.3.4. Servere cu stare şi servere fără stare.......

2.3.4.1. Un exemplu de server cu stare...........

2.3.4.2. Un exemplu de server fără stare..

2.3.4.3. Care este mai bun?..

2.4. Coordonare în sisteme distribuite...............

2.4.1. Un exemplu simplu; tranzacţii şi stare globală...

2.4.2. Sincronizareaîn sistemele distribuite................

2.4.2.1. Relaţia de ordonare cauzală a evenimentelor

2.4.2.2. Ceasuri logice; algoritmul lui Lamport...........

2.4.2.3. Ceasuri fizice..

2.4.3. Excludere mutuală în sistemele distribuite................

2.4.3.1. Coordonare centralizată.....

2.4.3.2. Coordonare complet distribuită.........

2.4.3.3. Coordonare printr-o metodă token-ring....

2.4.4. Alte probleme de coordonare................

3. Programare distribuită folosind socket.........

3.1. Conceptul de socket

3.1.1. Ce este socket?..

3.1.2. Fişierele header C pentru Unix şi WINDOWS................

3.1.3. Tipuri de socket....

3.1.3.1. Socket stream

3.1.3.2. Socket datagram........

3.1.3.3. Repere pentru alegerea tipului de socket

3.1.4. Adrese socket....

3.2. Scheme cadru de implementări client / server....

3.2.1. Scenariul aplicaţiilor socket stream....

3.2.2. Scenariul aplicaţiilor socket datagram

3.3. Biblioteca de apeluri sistem socket....

3.3.1. Apeluri socket de conexiune................

3.3.1.1. Sintaxele apelurilor: socket, bind, listen, connect, accept

3.3.1.2. Apelul sistem socket

3.3.1.3. Apelul sistem bind...

3.3.1.4. Apelul sistem listen.

3.3.1.5. Apelul sistem connect...........

3.3.1.6. Apelul sistem accept

3.3.1.6...........

3.3.2. Operaţii de I/O prin socket....

3.3.2.1. Apelurile sistem send, recv, sendto, recvfrom...........

3.3.2.2. Comparaţii cu apelurile read şi write..

3.3.2.3. Apelurile sistem readv şi writew

3.3.2.3...........

3.3.2.4. Apelurile sistem sendmsg şi recvmsg...........

3.3.2.5. Apelul sistem select

3.3.2.5...........

3.3.3. Rutine de manipulare a octeţilor şi întregilor................

3.3.3.1. Conversii ale reprezentărilor întregilor...........

3.3.3.2. Rutine de manevrare a şirurilor de octeţi...........

3.3.4. Gestiunea adreselor IP şi Internet................

3.3.4.1. Rutinele inet_addr şi inet_ntoa.........

3.3.4.1...........

3.3.4.2. Rutinele getpeername şi getsockname.

3.3.4.3. Rutina gethostbyname

3.3.5. Particularităţi de utilizare WINDOWS (WINSOCK)...............

3.4. Exemple de aplicaţii client / server cu socket....

3.4.1. rdir: Rezumat de director la distanţă..

3.4.1.1. Prezentarea problemei........

3.4.1.2. O variantă simplă rdir prin TCP...

3.4.1.2...........

3.4.1.3. rdir simplu sub Windows.......

3.4.1.4. rdir complet folosind TCP.

3.4.1.5. rdir complet folosind UDP

3.4.2. rcat: client TFTP de citire fişier..............

3.4.2.

3.4.2.1. Prezentarea problemei; formatele pachetelor TFTP.........

3.4.2.2. Sursa programului client rcat..

3.4.3. Jocul hangman: ghicirea unui cuvânt..............

3.4.3.1. Serviciul telnet pe post de client la hangman......

3.4.3.2. Programul server hangman......

3.4.3.3. Funcţia play_hangman de dirijare a jocului.........

3.4.4. stocuri: gestiunea unui lanţ de depozite

3.4.4.1. Prezentarea problemei......

3.4.4.2. Sursa serverului stocuri.........

3.4.4.3. Funcţia prelucrare_stoc.........

3.4.5. O aplicaţie de supraveghere:watchaccess........

3.4.5.

3.4.5.1. De ce este necesară supravegherea unei reţele?.........

3.4.5.2. Prezentarea aplicaţiei de supraveghere

3.4.5.3. Structura mesajelor.......

3.4.5.4. Fişierul header watchaccess.h.........

3.4.5.5. Serverul Constatare.....

3.4.5.6. Serverul Intervenţie....

3.4.5.6.........

3.4.5.7. Programul client Supraveghere

3.4.5.8. Cum devine operaţională supravegherea?.........

4. Apelul procedurilor la distanţă (RPC)......

4.1. Principiul de funcţionare al RPC.

4.1.1. Implementarea aplicaţiilor distribuite..............

4.1.2. Paradigma apelului la distanţă

4.1.3. Modelul RPC......

4.1.4. Implementări RPC...

4.1.5. Diferenţieri între cele trei standarde RPC......

4.2. Protocolul ONC RPC.............

4.2.1. Dezvoltarea aplicaţiilor asistată de RPCGEN..............

4.2.1.1. Metodologia de dezvoltare a aplicaţiilor simple RPC.

4.2.1.2. Manevrarea fişierelor într-o aplicaţie RPC.

4.2.1.3. Utilizare RPCGEN sub Unix.........

4.2.1.4. Compilarea / execuţia clientului şi a serverului sub Unix.

4.2.1.5. RPC sub Windows NT

4.2.2. Limbajul RPCL de definire a protocolului.............

4.2.3. Un exemplu de utilizare rpcgen..

4.2.3.1. Specificarea protocolului..

4.2.3.2. Descrierea procedurii apelabile la distanţă.........

4.2.3.3. Sursa aplicaţiei client

4.2.3.4. Sursele generate de rpcgen.........

4.2.3.4.........

4.2.3.5. Generare, compilare şi execuţie sub Unix.........

4.3. Reprezentarea externă a datelor (XDR)..

4.3.1. De ce este necesar un astfel de standard?..............

4.3.1.1. Un program "ciudat".........

4.3.1.2. De unde sunt diferenţele?....

4.3.1.3. Maşini little-endian şi big-endian.........

4.3.1.3.........

4.3.1.3.........

4.3.2. Reprezentarea datelor în XDR.

4.3.2.1. Bloc şi ordine de reprezentare..

4.3.3. Tipurile de date din XDR.....

4.3.3.1. Limbajul de specificare XDR.........

4.3.3.2. Un exemplu de descriere XDR

4.3.4. Stream-uri XDR.....

4.3.4.1. Stream standard I/O...

4.3.4.2. Stream de memorie.........

4.3.4.3. Stream record.........

4.3.4.4. Macrouri utile în folosirea streamurilor...

4.3.5. Filtre XDR..............

4.3.5.1. Filtre primitive.........

4.3.5.2. Macrouri pentru filtrele primitive.........

4.3.5.3. Filtre compuse.........

4.3.5.3.........

4.3.5.4. Filtre ajustabile.......

4.3.5.5. Gestiunea memoriei.........

4.3.5.6. Exemplu de stream XDR

4.4. Protocolul serviciului de reţea portmapper.............

4.5. Programarea RPC fără rpcgen..

4.5.1. Probleme de specificare şi identificare..............

4.5.1.1. Localizarea unui host.

4.5.1.2. Codificarea / decodificarea argumentelor şi rezultatelor.....

4.5.2. Identificarea procedurii de la distanţă

4.5.3. Biblioteca RPC......

4.5.4. Programare RPC la nivel înalt......

4.5.4.1. Apeluri sistem utilizate.........

4.5.4.2. O aplicaţie de evidenţă a notelor.........

4.5.5. Programare RPC la nivel elementar (LOW LEVEL).

4.5.5.1. Avantaje şi dezavantaje ale nivelului înalt.

4.5.5.2. Facilităţi oferite de RPC - low level.........

4.5.5.3. Principalele rutine RPC de acces LOW-LEVEL..........

4.5.5.3.........

4.5.5.4. Tratarea erorilor folosind biblioteca RPC.........

4.5.5.5. Autentificări..

4.5.5.6. Facilităţi suplimentare RPC.........

4.5.5.7. Un exemplu de low-level RPC; aplicaţia lnote

5. Programare distribuită folosind limbajul Java.................

5.1. Scurtă prezentare a limbajului.............

5.1.1. Principalele caracteristici.............

5.1.2. Cele mai simple două exemple

5.1.2.1. Programul standalone Salut.........

5.1.2.2. Appletul Salutap.........

5.1.3. Inceputurile Java: scurt istoric...

5.1.4. Scurtă prezentare a mecanismului de comunicaţie Web.....

5.2. Prezentare Java prin comparaţii cu C şi C++.............

5.2.1. Prezentare Java comparată cu C......

5.2.1.1. Structura unui program; accesul la mediu.........

5.2.1.2. Spaţiu de nume: pachete, clase, metode, câmpuri.........

5.2.1.3. Elemente lexicale.........

5.2.1.4. Tipuri de date primitive.........

5.2.1.5. Tipul referinţă obiect.........

5.2.1.6. Tipul referinţă tablou.........

5.2.1.7. Operatori........

5.2.1.8. Instrucţiuni...

5.2.1.9. Excepţii şi manipularea lor.........

5.2.1.10. Alte câteva diferenţe.........

5.2.2. Clase şi obiecte în Java......

5.2.2.1. Clase, obiecte, metode, variabile.........

5.2.2.2. Instanţiere şi distrugere obiecte; constructori...

5.2.2.3. Definiri statice (clasă): variabile, metode, iniţializatori....

5.2.2.4. Extinderi de clase, moştenire, clase componente.

5.2.2.4.........

5.2.2.5. Supranumire şi suprascriere..

5.2.2.6. Ierarhie de clase, superclase, clase abstracte.......

5.2.2.7. Modificatori de vizibilitate.......

5.2.2.8. Ce este în C++ şi nu este în Java?.........

5.3. Principalele pachete standard Java.....

5.3.1. Pachetul standard al limbajului: java.jang..............

5.3.1.1. Prezentarea generală a pachetului.....

5.3.1.2. Biblioteca matematică: clasa java.lang.Math.........

5.3.1.3. Biblioteca de apeluri sistem: java.lang.System.........

5.3.1.4. Manevrarea stringurilor: clasele java.lang.String şi java.lang.StringBuffer

5.3.1.5. Gestiunea firelor de execuţie: java.lang.Thread.........

5.3.2. Interfeţe grafice Java: java.awt

5.3.2.1. Prezentarea generală a pachetului.....

5.3.2.2. Culori, fonturi şi grafice.........

5.3.2.3. Superclasa GUI Component; manevrarea evenimentelor.........

5.3.2.4. Clasa Container şi descendenţii ei.........

5.3.2.5. Componente specializate pentru text..

5.3.2.6. Etichete, butoane, radio-butoane.........

5.3.2.7. Manageri de plasare a componentelor în containere.....

5.3.2.8. Un exemplu simplu de GUI.........

5.3.3. Appleturi Java......

5.3.3.1. Conceptul de applet şi pachetul java.applet.....

5.3.3.2. Ciclul de viaţă al unui applet.........

5.3.3.3. Legătura HTML - HTTP - Java.

5.3.3.4. Citirea parametrilor unui applet.........

5.3.3.5. Restricţii de securitate.......

5.3.4. Intrări / ieşiri (locale); pachetul java.io..

5.3.4.1. Acces prin stream şi acces random.........

5.3.4.2. Structura pachetului java.io.........

5.3.4.3. Gestiunea structurii de fişiere: clasa File..

5.3.4.4. Principalele metode pentru citire

5.3.4.5. Principalele metode de scriere.........

5.3.4.6. Clasa RandomAccessFile.....

5.3.4.7. Clasa InputStream şi descendenţii ei.........

5.3.4.8. Clasa OutputStream şi descendenţii ei.........

5.3.4.9. Un exemplu: copierea unui fişier

5.4. Programare distribuită în limbajul Java.....

5.4.1. Prezentarea generală a pachetului java.net

5.4.2. Clasele InetAddress şi Socket..............

5.4.2.1. Clasa InetAddress.

5.4.2.2. Clasa Socket.........

5.4.3. Transmitera si recepţionarea prin UDP..............

5.4.3.1. Clasa DatagramPacket.........

5.4.3.2. Clasa DatagramSocket.........

5.4.3.3. Un exemplu de comunicaţie prin UDP

5.4.4. Comunicare prin TCP..............

5.4.4.1. Clasa ServerSocket.

5.4.4.2. Implementarea unui Server.........

5.4.4.3. Variante de implementare client

5.4.5. Aplicaţia RemoteDir..............

5.4.5.1. Programul ServerRemoteDir.........

5.4.5.2. Clientul standalone RemoteDir...

5.4.5.3. Clientul applet RemoteDirApp.........

5.4.5.4. Clientul care apelează un server scris în C......

5.4.6. Accesul la resurse Internet prin URL..............

5.4.6.1. Clasa URL.

5.4.6.2. Clasa URLConnection.........

5.4.6.3. Exemplu de acces la o resursă Internet.........

5.4.7. Proiectarea unei aplicaţii de căutare: InfoSearch..............

5.4.7.1. Prezentarea generală a aplicaţiei.........

5.4.7.2. Scenariul funcţionării InfoSearch....

5.4.7.3. Descrierea pachetului InfoSearch....

5.4.7.4. Clasa InfoSearch....

5.4.7.5. Clasa AfisUseri........

5.4.7.6. Clasa ClientCentral.

5.4.7.7. Clasa ServerCentral şi clasele ajutătoare.......

5.4.7.8. ServerMasina şi clasele ajutătoare.......

5.4.7.9. Clasa CatPlan.........

5.4.7.10. Clasa ReadPlan......

5.4.7.11. Clasa UserInformations.........

5.4.7.12. Clasa SR....

5.4.8. Apelul metodelor la distamţă (RMI)...

6. Bibliografie.................

7. Lista de figuri.......

8. Lista de programe.

9. Index

 

        1.        Introducere

 

 

In contextul informatic actual, atât în ţară cât şi în lume, informatica distribuită este unul dintre domeniile “vârf de lance”, atât în teoria, cât şi în practica informatică. In sprijinul acestei tendinţe vin cel puţin trei motivaţii.

 

Mai întâi, faptul că aplicaţiile informatice actuale sunt de neconceput fără comunicaţii. Comunicarea în Internet a devenit o sursă inepuizabilă şi rapidă de documentare, depăşind complet toate celelalte surse de comunicare. La nivelul multora dintre aplicaţii, sursele primare de date sunt răspândite pe o suprafaţă mare: în clădiri diferite, în oraşe diferite etc. Punctele de prelucrare, eventual parţială, a acestor date sunt şi ele răspândite.

 

Un al doilea motiv este acela că o companie, indiferent de puterea ei economică, preferă să se doteze cu echipamente de calcul mai multe şi de puteri rezonabile (sau chiar mici), în loc să investească într-un singur sistem de calcul deosebit de puternic şi deosebit de scump, care să-i satisfacă toate necesităţile de calcul, prezente şi viitoare. Practica mondială a dovedit că partajarea şi însumarea resurselor de calcul - limitate - ale mai multor calculatoare de puteri nu prea mari, conduce, de cele mai multe ori, la rezultate comparabile cu ale unui supercalculator!

 

In al treilea rând, arhitecturile aplicaţiilor distribuite permit integrarea, într-o manieră dinamică, a unor platforme de calcul eterogene. De exemplu, se pot integra în aceeaşi aplicaţie părţi care lucrează sub WINDOWS 3.1, UNIX, LINUX, WINDOWS NT, operaţionale pe echipamentele hard care la suportă, începând de la 386 la Pentium PRO şi de la staţii Sun şi SPARC la procesoare RISC dintre cele mai performante. Paradigma aplicaţiilor distribuite are în vedere în primul rând posibilitatea ca aceste platforme de calcul “să se înţeleagă” în regim on-line.

 

Lucrarea de faţă are ca scop prezentarea modelelor, conceptelor şi a exemplelor care să facă posibilă dezvoltarea unor aplicaţii distribuite. Ea se adresează în primul rând informaticienilor, inginerilor de calculatoare, studenţilor din facultăţile de profil şi elevilor din clasele speciale de informatică. Se presupune că cititorul cunoaşte, la nivel mediu, limbajul C sau C++ şi că are un minim de experienţă în programarea şi utilizarea calculatoarelor.

 

Nivelul, modul de prezentare şi cantitatea de informaţie prezentată sunt astfel concepute, încât cititorul să poată elabora, numai pe baza lor, o aplicaţie distribuită de nivel mediu / mare. Afirmaţia aceasta este fondată şi pe o experienţă de câţiva ani a autorului în predarea unor cursuri de profil la anii IV şi master la Facultatea de Matematică şi Informatică.

 

S-a pus un accent deosebit pe exemple de aplicaţii, dintre cele mai diverse, de la cele mai simple la cele mai complicate. Pentru marea majoritate a aplicaţiilor în lucrare se prezintă textele sursă complete, cu toate explicaţiile necesare. Textele sursă complete sunt de asemenea disponibile pe un server Anonymous FTP - serverul ftp.ubbcluj.ro - , de unde doritorii le pot accesa prin Internet.

 

Caracterul monografic al lucrării constă în faptul că abordează, pe de o parte, modelele actuale de programare utilizate în aplicaţiile distribuite - modelele de aplicaţii client-server -, iar pe de altă parte prezintă şi utilizează cele mai importante trei instrumente de programare distribuită: comunicarea prin socket, aplicaţii ce au la bază tehnica RPC (Remote Procedure Call - apelul procedurilor de la distanţă) şi limbajul de programare Java, cel mai modern şi mai recent instrument de programare.

 

Cartea este structată pe cinci capitole. Vom prezenta pe scurt conţinutul fiecăruia dintre ele.

 

Capitolul 1 “Modele de comunicaţii în reţele”, prezintă două dintre familiile de protocoale de comunicaţii în reţele: OSI şi TCP/IP. Tot aici sunt prezentate principalele mecanisme de adresare în Internet: adrese IP; adrese Internet, specificări URL, serviciile Domain Name Server

 

Capitolul 2 “Sisteme distribuite şi algoritmi distribuiţi”, prezintă mai întâi noţiunea de sistem distribuit, algoritmi distribuiţi şi modelarea formală a lor. Se face o prezentare succintă a modelului client / server după care sunt prezentate câteva probleme clasice de coordonare în sistemele distribuite.

 

Capitolul 3 “Programare distribuită folosind socket“, abordează modelele socket de tip conexiune şi fără conexiune şi schemele cadru de implementări client / server folosind socket. Se prezintă de asemenea bibliotecile socket, accesibile atât sub Unix cât şi pe platforme WINDOWS prin pachetul WINSOCK.

 

Capitolul 4 “Apelul procedurilor la distanţă (RPC)” prezintă mai întâi modelul RPC şi standardele RPC: ONC, DCE şi ISO. Se prezintă apoi în detalu ONC-RPC pe platforme Unix şi WINDOWS: protocolul ONC, reprezentarea externă a datelor, serviciul portmapper etc.

 

Capitolul 5 “Programare distribuită folosind limbajul Java” face mai întâi o scurtă prezentare a limbajului, continuată cu o prezentare aproape completă prin comparaţii cu C şi  C++. Am omis din prezentare unele detalii de limbaj, deoarece spaţiul nu ne permite mai mult, iar aceste detalii nu sunt neapărat relevante pentru Java în context distribuit. In acest spirit s-au prezentat principalele pachete standard (biblioteci) Java. Partea consistentă a capitolului constă în prezentarea pachetului destinat comunicaţiilor Java şi a unor aplicaţii specifice.

 

In lucrare apar deosebit de multe exemple. Este suficient să se consulte în acest scop lista de programe. Pe lângă exemplele strict punctuale, destinate lămuririi unor concepte, apar şi câteva aplicaţii complete, în capitolele 3, 4 şi 5. Pentru a permite cititorului să facă comparaţii, unele dintre ele sunt realizate atât prin socket, cât şi prin RPC şi Java. Principalele aplicaţii distribuite pe care le prezentăm sunt:

 

· rezumatul unui director la distanţă;

· consultarea unui fişier la distanţă;

· jocul hangman: clientul ghiceşte un cuvânt cunoscut de server;

· accesul şi consultarea unor resurse din Internet;

· o aplicaţie de gestiune a stocurilor la un lanţ de depozite;

· o aplicaţie distribuită de evidenţă şi gestiune a rezultatelor de la examene;

· o aplicaţie de supraveghere a unei reţele metropolitane de calculatoare;

· o aplicaţie de căutare / consultare într-o reţea metropolitană

· etc.

 

Pentru fiecare dintre acestea s-a evidenţiat în primul rând caracterul de aplicaţie distribuită. S-a eliminat, păstrându-se funcţionalitatea, detaliile nerelevante pentru caracterul distribuit sau de comunicaţie.

 

Elementele grafice care însoţesc prezentarea textului sunt numerotate în cadrul fiecărui capitol, începând de la 1, sub forma: Figura c.n. Este anexată o listă de astfel de figuri.

 

Toate secvenţele de programe: programe propriu-zise, scheme cadru de elaborare a unor programe, definiţii ale unor clase, unele rezultate sub formă de text sunt de asemenea numerotate în cadrul fiecărui capitol, începând de la 1. Numerotarea lor se face sub forma: Programul c.n. Această supralicitare a cuvântului “program” conduce uneori la formulări oarecum ciudate, ca de exemplu “Programul 3.13 Exemplu de dialog hangman - telnet” sau “Programul 4.28 Intrarea I pentru note”. Ne cerem scuze, poate ar fi fost poate mai bine ca în astfel de cazuri să spunem în loc de “Program” un alt cuvânt, dar n-am făcut-o.

 

Autorul mulţumeşte pe această cale tuturor celor care l-au sprijinit într-un fel sau altul în elaborarea prezentei lucrări.

 

Conf. dr. Florian Mircea BOIAN

florin@cs.ubbcluj.ro