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