Sunteți pe pagina 1din 10

1

Programare distribuit cu socketuri Java - UTCN, C. Ivan

Programare distribuit cu socketuri Java


1.Obiective
Familiarizarea cu conceptele de baz referitoare la comunicaia ntre calculatoare :socket i port
Studiul bibliotecii de socketuri Java.net
Crearea unor aplicaii distribuite n reea
2. Fundamentare teoretic
Programarea n retea implica trimiterea de mesaje si date ntre aplicatii ce ruleaza pe calculatoare
aflate ntr-o retea locala sau conectate la Internet.Pachetul care ofera suport pentru scrierea aplicatiilor de
retea in Java este java.net., iar clasele din acest pachet ofera o modalitate facila de programare n retea,
fara a fi nevoie de cunostinte prealabile referitoare la comunicarea efectiva ntre calculatoare. Cu toate
acestea, sunt necesare cateva notiuni fundamentale referitoare la retele cum ar fi: protocol, adresa IP, port,
socket.
Un protocol reprezinta o conventie de reprezentare a datelor folosita n comunicarea ntre doua
calculatoare. Avand n vedere faptul ca orice informatie care trebuie trimisa prin retea trebuie serializata
astfel ncat sa poata fi transmisa secvential, octet cu octet, catre destinatie, era nevoie de stabilirea unor
conventii (protocoale) care sa fie folosite atat de calculatorul care trimite datele cat si de cel care le primeste,
pentru a putea comunica. Doua dintre cele mai utilizate protocoale sunt TCP si UDP, caracterizate de
urmatoarele aspecte:
TCP (Transport Control Protocol) este un protocol ce furnizeaza un
flux sigur de date ntre doua calculatoare aflate n retea. Acest protocol asigura stabilirea unei
conexiuni permanente ntre cele doua calculatoare pe parcursul comunicatiei.
UDP (User Datagram Protocol) este un protocol bazat pe pachete independente de date, numite
datagrame, trimise de la un calculator catre altul fara a se garanta n vreun fel ajungerea acestora la
destinatie sau ordinea n care acestea ajung. Acest protocol nu stabileste o conexiune permanta ntre
cele doua calculatoare.
Orice calculator conectat la Internet este identificat n mod unic de adresa sa IP (IP este acronimul
de la Internet Protocol). Aceasta reprezinta un numar reprezentat pe 32 de biti, uzual sub forma a 4 octeti,
cum ar fi de exemplu: 193.231.30.131 si este numit adresa IP numerica. Corespunzatoare unei adrese
numerice exista si o adresa IP simbolica, pentru adresa numerica anterioara. De asemenea, fiecare calculator
aflat ntr-o retea locala are un nume unic ce poate fi folosit la identificarea locala a acestuia.
Notiunea de port. Un calculator are n general o singura legatura fizica la retea. Orice informatie
destinata unei anumite masini trebuie deci sa specifice obligatoriu adresa IP a acelei masini. Insa pe un
calculator pot exista concurent mai multe procese care au stabilite conexiuni n retea, asteptand diverse
informatii. Prin urmare, datele trimise catre o destinatie trebuie sa specifice pe langa adresa IP a
calculatorului si procesul catre care se ndreapta informatiile respective. Identificarea proceselor se
realizeaza prin intermediul porturilor.
Un port este un numar pe 16 biti care identifica n mod unic procesele care ruleaza pe o anumita
masina. Orice aplicatie care realizeaza o conexiune n retea va trebui sa ataseze un numar de port acelei
conexiuni. Valorile pe care le poate lua un numar de port sunt cuprinse ntre 0 si 65535 (deoarece sunt
numere reprezentate pe 16 biti), numerele cuprinse ntre 0 si 1023 fiind nsa rezervate unor servicii sistem
si din acest motiv nu trebuie folosite n aplicatii.
1

Programare distribuit cu socketuri Java - UTCN, C. Ivan

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

Programare distribuit cu socketuri Java - UTCN, C. Ivan

Un obiect de tip URL poate fi folosit pentru:


Aflarea informatiilor despre resursa referita (numele calculatorului gazda, numele fisierului,
protocolul folosit. etc).
Citirea printr-un flux a continutului fisierului respectiv.
Conectarea la acel URL pentru citirea si scrierea de informatii.
Conectarea la un URL se realizeaza prin metoda openConnection ce stabileste o conexiune
bidirectionala cu resursa specificata. Aceasta conexiune este reprezentata de un obiect de tip
URLConnection, ce permite crearea atat a unui flux de intrare pentru citirea informatiilor de la URL-ul
specificat, cat si a unui flux de iesire pentru scrierea de date catre acel URL.
Operatiunea de trimitere de date dintr-un program catre un URL este similara cu trimiterea de date
dintr-un formular de tip FORM aflat ntr-o pagina HTML. Metoda folosita pentru trimitere este POST. In
cazul trimiterii de date, obiectul URL este uzual un proces ce ruleaza pe serverul Web referit prin URL-ul
respectiv (jsp, servlet, cgi-bin, php, etc).
2.2. Socketuri TCP
Un socket (soclu) este o abstractiune software folosita pentru a reprezenta fiecare din cele doua
capete ale unei conexiuni ntre doua procese se ruleaza ntr-o retea. Fiecare socket este atasat unui port
astfel ncat sa poata identifica unic programul caruia i sunt destinate datele.
Socket-urile sunt de doua tipuri:
TCP, implementate de clasele Socket si ServerSocket;
UDP, implementate de clasa DatagramSocket.
O aplicatie de retea ce foloseste socket-uri se ncadreaza n modelul client/server de concepere a
unei aplicatii. In acest model aplicatia este formata din doua categorii distincte de programe numite servere,
respectiv clienti.
Programele de tip server sunt cele care ofera diverse servicii eventualilor clienti, fiind n stare de
asteptare atata vreme cat nici un client nu le solicita serviciile. Programele de tip client sunt cele care initiaza
conversatia cu un server, solicitand un anumit serviciu. Uzual, un server trebuie sa fie capabil sa trateze mai
multi clienti simultan si, din acest motiv, fiecare cerere adresata serverului va fi tratata ntr-un fir de executie
separat.
Incepand cu versiunea 1.4 a platformei standard Java, exista o clasa utilitara care implementeaza o
pereche de tipul (adresa IP, numar port). Aceasta este InetSocketAddress (derivata din SocketAddress),
obiectele sale fiind utilizate de constructori si metode definite n cadrul claselor ce descriu socketuri, pentru
a specifica cei doi parametri necesari identificarii unui process care trimite sau receptioneaza date n retea.
2.2.1.Clasa Socket
Clasa Socket (din pachetul java.net) ofer posibilitatea comunicrii folosind socketurile, iar clasa
ServerSocket implementeaz un socket folosit n servere pentru a atepta conexiuni de la clieni.
Un socket n Java este reprezentarea unei conexiuni TCP, folosind aceast clas un client poate crea canale
de comunicaie de tip streamuri de date. Dup stabilirea conexiunii, hosturile local, respectiv remote pot
comunica folosind o conexiune tip full duplex.
Constructorii cei mai utilizai ai acestei clase sunt:

Programare distribuit cu socketuri Java - UTCN, C. Ivan

Protected Socket () creeaz un socket neconectat,care poate fi ulterior ataat la o conexiune.


Socket (String host, int port) throws UnknownHostException, IOException - creeaz un
socket TCP i ncearc conectarea la portul hostului specificat prin nume.
Socket (InetAddress address, int port ) throws IOException creeaz un socket TCP i-l
conecteaz la portul specificat al hostului identificat prin adres.

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.

Programare distribuit cu socketuri Java - UTCN, C. Ivan

getInetAddress() returneaz adresa utilizat de server (a hostului local, pentru sisteme


multihomed nu se poate previziona care adres va fi returnat)
getLocalPort() permite ascultarea unui port nespecificat, aceast metod permite aflarea acestui
port.
2.2.3.Inchiderea unui socket
Multe din protocoale folosesc presupunerea c aceste socketuri se nchid singure dup un anumit
numr de schimburi de mesaje deoarece pentru anumite programe care pot rula la infinit este necesar ca
socketurile s fie nchise.
Close() throws IOException elibereaz portul pentru alte programe care l pot utiliza, prin
nchiderea conexiunii.
Dup nchiderea unui socket, numrul de port i adresa local sunt nc accesibile folosind metodele
GetInetAddress(), getLocalPort(), getPort().
2.2.4.Setarea opiunilor specifice unui socket
(set)getSoTimeout(int timeout) - sunt utilizate n protocoale complexe care necesit conexiuni
multiple ntre client i server (valoarea implicit este 0, de obicei setarea parametrului presupune
specificarea naintea metodei accept() a valorii de timeout). Ali parametri care este necesar s fie setai n
cazul unor protocoale complexe sunt TCP_Nodelay asigur transmiterea pachetelor ct de repede posibil
sau SO_Linger specific modul de tratare a datagramelor transmise dup nchiderea unui socket.
In acest model se stabileste o conexiune TCP ntre o aplicatie client si o aplicatie server care
furnizeaza un anumit serviciu. Avantajul protocolul TCP/IP este ca asigura realizarea unei comunicari
stabile, permanente n retea, existand siguranta ca informatiile trimise de un proces vor fi receptionate corect
si complet la destinatie sau va fi semnalata o exceptie n caz contrar.
Legatura ntre un client si un server se realizeaza prin intermediul a
doua obiecte de tip Socket, cate unul pentru fiecare capat al canalului de comunicatie dintre cei doi. La
nivelul clientului crearea socketului se realizeaza specificand adresa IP a serverului si portul la care ruleaza
acesta, constructorul uzual folosit fiind:
Socket(InetAddress address, int port)
La nivelul serverului, acesta trebuie sa creeze ntai un obiect de tip ServerSocket. Acest tip de
socket nu asigura comunicarea efectiva cu clientii ci este responsabil cu ascultarea retelei si crearea unor
obiecte de tip Socket pentru fiecare cerere aparuta, prin intermediul caruia va fi realizata legatura cu clientul.
Crearea unui obiect de tip ServerSocket se face specificand portul la care ruleaza serverul, constructorul
folosit fiind: ServerSocket(int port)
Metoda clasei ServerSocket care asteapta asculta reteaua este accept.Aceasta blocheaza procesul
parinte pana la aparitia unui cereri si returneaza un nou obiect de tip Socket ce va asigura comunicarea cu
clientul. Blocarea poate sa nu fie permanenta ci doar pentru o anumita perioada de timp - aceasta va fi
specificata prin metoda setSoTimeout, cu argumentul dat n milisecunde.

Programare distribuit cu socketuri Java - UTCN, C. Ivan

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;

Structura generala a unui server bazat pe conexiuni este urmatoarea:


1. Creeaza un obiect de tip ServerSocket la un anumit port
2. Asteapta realizarea unei conexiuni cu un client,
folosind metoda accept; (va fi creat un obiect nou de tip Socket)
3. Trateaza cererea venita de la client:
3.1 Deschide un flux de intrare si primeste cererea
3.2 Deschide un flux de iesire si trimite raspunsul
3.3 Inchide fluxurile si socketul nou creat
Este recomandat ca tratarea cererilor sa se realizeze n fire de executie separate, pentru ca metoda
accept sa poata fi reapelata cat mai repede n vederea stabilirii conexiunii cu un alt client.
Structura generala a unui client bazat pe conexiuni este:
1. Citeste sau declara adresa IP a serverului si portul la care acesta ruleaza;
2. Creeaza un obiect de tip Socket cu adresa si portul specificate;
3. Comunica cu serverul:
3.1 Deschide un flux de iesire si trimite cererea;
3.2 Deschide un flux de intrare si primeste raspunsul;
3.3 Inchide fluxurile si socketul creat;

Programare distribuit cu socketuri Java - UTCN, C. Ivan

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.

In pachetul Java.net exist clasele DatagramSocket, DatagramPacket i MulticastSocket care ofer


suport pentru programarea transmisiei de date folosind datagrame. Fiecare datagram conine un header i
o zon de date. Headerul cuprinde informaiile de adresare (portul i adresa surs i destinaie) i alte
informaii legate de asigurarea transmisiei. Datagramele au lungime fix de aceea este nevoie uneori s fie
mprite n pachete i refcute la destinaie. Transmisia de datagrame se realizeaz fr stabilirea prealabil
a unei conexiuni, pachetele transmise nu trebuie recepionate n aceeai ordine i deasemenea un socket de
tip datagram poate recepiona date de la mai multe hosturi diferite.
Clasa DatagramPacket
Clasa DatagramPacket organizeaz datele n pachete tip UDP. Constructorii clasei DatagramPacket sunt:
DatagramPacket (byte buffer [], int length ) - unde, buffer reprezint un tablou care
memoreaz pachetul, iar length reprezint numrul maxim de bytes care pot fi citii n buffer.
DatagramPacket (byte buffer [], int length, Inetaddress address, int port) pachetul va fi
livrat la adresa de host i portul specificate. Este necesar ca la cellalt capt al comunicaiei s
existe un server UDP care s asculte conexiuni.Volumul de date care poate fi plasat ntr-un
pachet depinde de tipul protocolului, i de tipul tehnologiei utilizate.
Metodele acestei clase sunt:
GetAddress() returneaz obiectul InetAddress reprezentnd adresa hostului remote.
GetPort() - returneaz portul datagramei pe maina remote.
7

Programare distribuit cu socketuri Java - UTCN, C. Ivan

GetLength() - returneaz lungimea datagramei (numr de bytes)


GetData() returneaz un tablou care conine datele transferate folosind datagrame.

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.

2.3.2.Socketuri multicast. Clasa MulticastSocket


Transmisia (recepia) multicast ofer un set de avantaje de loc de neglijat ntre care simplificarea
proiectrii i reducerea consumului de lime de band pentru un set de aplicaii a cror topologie necesit
arbori de acoperire (din domeniul procesrii masiv paralele, a serviciilor de nume, a serviciilor de directoare
distribuite, a mecanismelor de replicare a bazelor de date, etc.).
Pentru a recepiona date multicast de la un host remote, dup crearea unui socket multicast este
necesar asocierea la un grup de multicast apoi va putea fi stabilit conexiunea pentru a transmite i
recepiona date. Asocierea la grup anun ruterele aflate n calea ctre serverul care ofer serviciul s
transmit datele n mod multicast, hostul fiind responsabil cu adresarea pachetelor n mod multicast.
Ataarea la grup determin comunicaia similar celei utilizate la transferul de datagrame, trebuie remarcat
faptul c doar pentru a transmite n mod multicast nu este necesar ataarea la un grup multicast.
Ceea ce difereniaz totui comunicarea multicast de cea unicast o constituie specificarea i
gestionarea cmpului TTL (Time to live) cmp ce permite evitarea buclelor de rutare pentru topologii
arborescente complexe.
Adresele de tip multicast sunt adrese de clas D n gama de adrese 224.0.0.0
239.255.255.255.255, domeniu structurat pe diferite tipuri de adrese multicast rezervate sau nu.

Programare distribuit cu socketuri Java - UTCN, C. Ivan

Constructorii clasei MulticastSocket () utilizai n procesarea datagramelor multicast sunt:


MulticastSocket() throws SocketException creaz un socket legat la portul anonim (orice port
asignat de sistem) i util pentru clienii ce nu necesit specificarea unui port.
MulticastSocket(int port ) throws SocketException
Metodele clasei necesare comunicrii cu un grup multicast sunt:
JoinGroup(Inetaddress mcastaddr) throws SocketException
LeaveGroup(Inetaddress mcastaddr) throws SocketException
Send (DatagramPacket dp, byte ttl) throws IOException, SocketException
Set (Get)Interface (InetAddress interface) throws SocketException pentru alegerea
interfeei utilizate pentru transmisia multicast n hosturile multihomed.
Pentru recepia de pachete multicast poate fi folosit metoda receive a claselor DatagramSocket.
Exemplul urmtor i propune ilustrarea modului de utilizare n recepie, respectiv transmisie a
pachetelor de tip multicast, datorit faptului c exist multe similitudini cu transmisia datagramelor.
Transmiterea unui pachet unui grup multicast presupune specificarea valorii unui cmp special TTL (Time
to live, a crui valoare implicit este 255, alte valori uzuale: localhost-0, subreea- 1, alt reea LAN: 16 )
n coninutul datagramei, cu scopul de a preveni bucle infinite de rutare a datagramelor n reea, controlnd
astfel ct de departe sunt transferate pachetele.
Transmisie:
// byte[] data
//InetAddress multicastGroup
//int multicastPort
MulticastSocket socket = new MulticastSocket() ;
DatagramPacket packet = new DatagramPacket (data, data.length, multicastGroup, multicastPort)
;
Socket.send (packet, (byte) 64 ) ;
Socket.close () ;
Corespunztor,secvena pentru recepia unui pachet n mod multicast este:
9

10

Programare distribuit cu socketuri Java - UTCN, C. Ivan

// InetAddress multicastGroup
//int multicastPort

MulticastSocket socket = new MulticastSocket(MulticastPort) ;


socket.joinGroup (multicastGroup);
byte[] buffer = new byte [65508] ;
DatagramPacket packet = new DatagramPacket () ;
socket.receive(packet);
InetAddress fromAddr = packet.getAddress() ;
int fromPort = packet.getPort();
int length = packet.getLength() ;
byte [] data = packet.getData() ;
..
socket.leaveGroup (multicastGroup) ;
socket.close () ;
3. Referine bibliografice

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

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