Documente Academic
Documente Profesional
Documente Cultură
Pentru implementarea aplicaiilor de reea pachetul Java.net ofer suport independent de sistem ,
avand la baza modelului de comunicaie tip client - server. Acest pachet conine clase, interfee i excepii
ce implementeaz n form obiectual conceptele uzuale de comunicare. Astfel, un client Java, pentru a
obine un anumit serviciu de la un server remote, folosete adresa serverului pentru a solicita conexiunea,
iar serverul ascult reeaua i ateapt cereri din partea clienilor. Deoarece un calculator posed o singur
conexiune fizic la reea, conexiune utilizat de toate aplicaiile ce solicit lucrul n reea, pentru
identificarea aplicaiei creia i este destinat un pachet sunt folosite porturile. Stabilirea conexiunii
presupune utilizarea ca i identificatori de hosturi comunicante a adresei IP i a adresei portului.
2.1. Elemente de baz n programarea cu socketuri
Pentru a permite lucrul cu identificatori simbolici de tip nume dar i cu adresele IP ale hosturilor
din reea, n Java este definit clasa InetAddress ce furnizeaz abstraciunile necesare accesrii hosturilor.
Metodele statice ale clasei sunt:
o Public static InetAddress getByName(String host) throws UnknownHostException
returneaz numele hostului local pentru care se cunoate adresa IP.
o Public static InetAddress getLocalhost() throws UnknownHostException- determin
adresa IP a hostului local
o Public static InetAddress getAllByName( String host) - returneaz n tablou adreseleIP ale
hostului curent
o Public byte [] getAddress(), returneaz adresa IP a obiectului curent n form de ir
o Public String getHostName() returneaz numele calculatorului cruia i corespunde obiectul
InetAddress
o Public String getHostAddress() returneaz adresa IP cruia i corespunde obiectul
InetAddress
Clasa URL ofer faciliti necesare manipulrii locatorilor universali de resurse URL.
Forma complet a unui asemenea locator este: Protocol://nume_calculator:port/nume_cale#ref
Numele calculatorului poate fi n format simbolic sau adres Internet, portul se specific dac nu este folosit
cel standard, iar ref nu este parte a URL ci refer o parte din documentul specificat funcie de tipul resursei.
Clasa care permite lucrul cu URL-uri este java.net.URL. Aceasta are mai multi constructori pentru
crearea de obiecte ce reprezinta referinte catre resurse aflate n retea, cel mai uzual fiind cel care primeste
ca parametru un sir de caractere. In cazul n care sirul nu reprezinta un URL valid va fi aruncata o exceptie
de tipul MalformedURLException.
Constructorii clasei sunt:
Public URL (String protocol, String host, int port, String file) throws
MalformedURLException creeaz un obiect URL
Public URL (String protocol, String host, String file ) throws
MalformedURLException, creaz un nou obiect URL absolut pentru care se folosete
portul standard
Public URL (URL context, String spec) throws MalformedURLException- creeaz un
URL bazat pe interpretarea specificrii spec corespunztor contextului dat., dac
argumentul context este null, iar spec este doar o specificare parial componentele lips
vor fi preluate din context.
Public URL (String spec) throws MAlformedURLException ceeaz un obiect URL
din reprezentarea string dat.
2
Socket (String host, int port, Inet Address localAddr, int localPort) throws IOException i
Socket (InetAddress address, int port, InetAddress localAddr, int local Port) throws IOException,creeaz
socketul TCP, l leag la hostul (adresa) i portul local i se conecteaz la hostul remote. Acesta este
constructorul care permite alegerea manual a interfeei care va fi conectat.
Metodele clasei permit identificarea hostului remote, a porturilor utilizate i extragerea streamurilor
utilizate n comunicaia bidirecional. Comunicaia folosind socketurile n Java presupune crearea unui
Socket apoi utilizarea metodelor getInputStream() i getOutputStream() pentru a obine streamurile
necesare comunicaiei. Alte metode definite n aceast clas sunt: getInetAddress(), getPort(), toString().
Excepiile sunt cele cauzate de imposibilitatea legrii la hostul local sau remote, refuzarea unei
conexiuni datorit inexistenei serverului care s asculte pe un anumit port sau imposibilitatea atingerii
hostului remote.
2.2.2.Clasa ServerSocket
Aceast clas ofer funcionalitatea mecanismului prin care un server accept conexiuni de la
clieni, ea permite crearea unei conexiuni socket pentru fiecare client apoi serverul va gestiona aceste
conexiuni extrgnd streamuri de intrare i ieire pentru a comunica cu clientul,dup ce a fost creat o
conexiune de acest tip, va putea fi utilizat un socket pentru a transfera date.
Ciclul de via al unui server clasic conine urmtoarele etape: crearea unui nou socket- server care
va asculta conexiuni folosind metoda accept() (metoda care va returna un obiect de tip socket), efectuarea
de transferuri de streamuri (in, out sau in i out), clientul i serverul vor continua interaciunea respectnd
un anumit protocol, apoi se va nchide conexiunea de ctre unul din capetele comunicante, i n final se va
atepta dup o nou conexiune.
Proiectarea unui server complex presupune utilizarea threadurilor astfel nct serverul s fie capabil
s proceseze ct de repede posibil orice nou conexiune.
Constructorii clasei pentru crearea de noi socketuri sunt:
ServerSocket(int port) throws IOException, BindException creeaz un socket la portul
specificat, valoarea zero semnific orice port disponibil.
ServerSocket(int port, int backlog) throws IOException, BindException creeaz un
socket la portul specificat i cu numrul de cereri de conectare care pot fi pstrate n
ateptare (nainte de a refuza alte cereri, implicit 50 cereri).
ServerSocket (int port, int backlog, InetAddress bindAddr) throws IOException
socketul creat se leag la adresa de IP specificat. Este util pentru sistemele cu mai multe
adrese de IP, permind alegerea acesteia.
Complementar exist definii constructori care pot fi utilizai pentru a crea propriile implementri
de socketuri, eventual utiliznd servere de proxy sau diverse protocoale de securitate.
Metodele clasei
accept()throws IOException- metoda este utilizat la acceptarea unei conexiuni. Este soluia de
comunicaie blocant deoarece serverul va fi oprit pn la conectarea clientului.
Pentru fiecare din cele doua socketuri deschise pot fi create apoi doua fluxuri pe octeti pentru
citirea, respectiv scrierea datelor. Acest lucru se realizeaza prin intermediul metodelor getInputStream,
respectiv getOutputStream.
Fluxurile obtinute vor fi folosite mpreuna cu fluxuri de procesarecare sa asigure o comunicare facila ntre
cele doua procese. In functie de specificul aplicatiei acestea pot fi perechile:
BufferedReader, BufferedWriter si PrintWriter - pentru comunicare prin intermediul sirurilor
de caractere;
DataInputStream, DataOutputStream - pentru comunicare prin date primitive;
ObjectInputStream, ObjectOutputStream - pentru comunicare prin intermediul obiectelor;
2.3.Socketuri datagrame
In acest model nu exista o conexiune permanenta ntre client si server prin intermediul careia sa se
realizeze comunicarea. Clientul trimite cererea catre server prin intermediul unuia sau mai multor pachete
de date independente, serverul le receptioneaza, extrage informatiile continute si returneaza raspunsul tot
prin intermediul pachetelor. Un astfel de pachet se numeste datagrama si este reprezentat printr-un obiect
din clasa DatagramPacket. Rutarea datagramelor de la o masina la alta se face exclusiv pe baza informatiilor
continute de acestea. Primirea si trimiterea datagramelor se realizeaza prin intermediul unui socket,
modelat prin intermediul clasei DatagramSocket.
Dupa cum am mentionat deja, dezavantajul acestei metode este ca nu garanteaza ajungerea la
destinatie a pachetelor trimise si nici ca vor fi primite n aceeasi ordine n care au fost expediate. Pe de alta
parte, exista situatii n care aceste lucruri nu sunt importante si acest model este de preferat celui bazat pe
conexiuni care solicita mult mai mult atat serverul cat si clientul. De fapt, protocolul TCP/IP foloseste tot
pachete pentru trimiterea informatiilor dintr-un nod n altul al retelei, cu deosebirea ca asigura respectarea
ordinii de transmitere a mesajelor si verifica ajungerea la destinatie a tuturor pachetelor n cazul n care
unul nu a ajuns, acesta va fi retrimis automat.
Clasa DatagramSocket
Aceast clas permite transmisia i recepia datagramelor. Constructorii clasei sunt:
DatagramSocket() throws SocketException - creeaz un socket datagram la un port aleator
ales (anonim).
DatagramSocket (int port ) throws SocketException - creeaz un socket care ascult la un
port specificat.
DatagramSocket (int port, InetAddress local ) throws SocketException socketul creat
este i legat la o adres local.
2.3.1.Transmisia i recepia datagramelor
Dup crearea unui DatagramPacket i construirea unui DatagramSocket pachetul acesta va fi
transferat folosind metoda send(), respectiv recepionat folosind metoda receive().
send(DatagramPacket dp) throws IOException
receive(DatagramPacket dp) throws IOException
Dupa crearea unui pachet procesul de trimitere si primire a acestuia implica apelul metodelor send
si receive ale clasei DatagramSocket. Deoarece toate informatii sunt incluse n datagrama, acelasi socket
poate fi folosit atat pentru trimiterea de pachete, eventual catre destinatii diferite, cat si pentru receptionarea
acestora de la diverse surse. In cazul n care refolosim pachete, putem schimba continutul acestora cu
metoda setData, precum si adresa la care le trimitem prin setAddress, setPort si setSocketAddress.
Extragerea informatiilor contiunte de un pachet se realizeaza prin metoda getData din clasa
DatagramPacket. De asemenea, aceasta clasa ofera metode pentru aflarea adresei IP si a portului procesului
care a trimis datagrama, pentru a-i putea raspunde daca este necesar. Acestea sunt: getAdress, getPort si
getSocketAddress.
10
// InetAddress multicastGroup
//int multicastPort
https://docs.oracle.com/javase/tutorial/networking/sockets/
http://www.oracle.com/technetwork/java/socket-140484.html
http://www.tutorialspoint.com/java/java_networking.htm
http://www.cise.ufl.edu/~amyles/tutorials/tcpchat/
4. Elemente de evaluare
1. Proiecai o aplicaie care s implementeze comunicaia ntre un client i un server respectnd
specificaiile: programul server ascult reeaua i ateapt s primeasc o cerere de la un client.
Dac cererea este recepionat fr conflicte, serverul proceseaz cererea i nchide conexiunea.
Clientul folosete o adres pentru a solicita o conexiune unui calculator n reea (n mod uzual
solicit un serviciu unui server), apoi se deconecteaz din reea.
2. Propuneti o soluie de server neblocant care s utilizeze valori de timeout. Proiectai un server
concurent care s genereze pentru fiecare conexiune acceptat un nou fir de execuie.
3. S se proiecteze un program server care cere o parol pentru autentificarea unui client apoi va
trimite n reea un fiier ctre programul client. Programul client se va conecta la server, va trimite
parola solicitat, va solicita un fiier i apoi va salva fiierul solicitat.
10