Sunteți pe pagina 1din 15

PROGRAMAREA N REEA FOLOSIND SOCKETURI JAVA (2)

LUCRAREA NR. 8
PROGRAMARE N REEA FOLOSIND SOCKETURI JAVA
1. Scopul lucrrii
Lucrarea i propune studiul comunicaiei de tip client-server bazat pe mecanismele de tip socket,
folosind facilitile oferite de limbajul Java. Acest limbaj a fost ales datorit faptului c este un
limbaj obiectual i ofer mecanisme evaluate de comunicaie n reea, suport robust pentru
concuren i pentru tratarea erorilor. Se dorete familiarizarea cu mecanismele specifice i clasele
(constructorii i metodele acestora) utilizate
pentru comunicarea n reea existente n limbajul Java (diverse categorii de socketuri, URL-uri) i
proiectarea unor aplicaii simple client server.

2. Consideraii teoretice
2.1 Introducere
Conceptele teoretice necesare programrii n reea folosind socketurile Unix se regsesc i n cazul
programrii n reea folosind limbajul Java. Pentru proiectarea aplicaiilor de reea se folosete
pachetul Java.net, care ofer suport independent de sistem pentru implementarea 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.
Pachetele Java.net i Java.io conin clasele i metodele necesare programrii n reea. Clasele i
metodele lor, necesare implementrii programrii cu socketuri n Java vor fi descrise n cele ce
urmeaz. O list deloc exhaustiv a acestora conine urmtoarele clase: DatagramPacket,
DatagramSocket, MulticastSocket, InetAddress, ServerSocket, Socket, URL, URLConnection,
URLEncoder, etc.
Instrumentele mediului Java utilizate n programarea i depanarea programelor sunt:
java - interpretorul Java;
javac - compilatorul Java;
appletviewer - vizualizorul de appleturi Java;
101

REELE LOCALE DE CALCULATOARE

javadoc - generatorul de fisiere de documentaie API;


javap - dezasamblorul pentru fisiere class;
jdb - debuger (Java debuger);
javah - generatorul de fisiere C de tip header i de tip stub.

2.2 Elemente de baz n programarea cu socketuri.Clasa InetAddress, URL


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:
Public staticInetAddress getByName (Sring host) throws
UnknownHostException returneaz numele hostului local pentru care se
cunoate adresa IP;
Public
static
InetAddress
getLocalhost()
throws
UnknownHostException - determin adresa IP a hostului local;
Public static InetAddress getAllByName( String host) - returneaz
n tablou adreseleIP ale hostului current;
Public byte [] getAddress()- returneaz adresa IP a obiectului curent n
form de ir;
Public String getHostName() - returneaz numele calculatorului cruia i
corespunde obiectul InetAddress;
Public String getHostAddress() returneaz adresa IP cruia i corespunde
obiectul InetAddress.
Exemplul 1
Programul ilustreaz funcionalitatea acestei clase, se tiprete adresa mainii locale i apoi ntr-o
bucl se accept nume de hosturi i le verific.
import java.net.*;
import java.io.* ;
public class InetExample {
}
public static void main (String[] args){
printLocalAddress () ;
Reader kbd = new FileReader (FileDescriptor.in) ;
BufferedReader bufferedKbd = new BufferedReader (kbd) ;
try {
String name ;
do {
System.out.print(nume de host sau adresa IP:);
System.out.flush ();
name = bufferedkbd.readLine () ;
if (name !=null);

102

PROGRAMAREA N REEA FOLOSIND SOCKETURI JAVA (2)


printRemoteAddress (name);
} while (name !=null);
System.out.println (exit);
} catch(IOException ex) {
System.out.println (Input error: );
ex.printStackTrace();
}

//static void printLocalAddress()


//static void printRemoteAddress(String name),

cu procedurile
static void printLocalAddress () {
try {
InetAddress myself = InetAddress.getLocalHost();
System.out.println(nume:+ myself.getHostName());
System.out.println (IP:+ myself.getHostAddress ());
System.out.println(clasa:+ipClass(myself.getAddress());
}
catch (UnknownHostException ex)
{
System.out.println (nu ma gasesc);
ex.printStackTrace();
}}
//static char ipClass (byte [] ip){
int highByte=0xff&ip{0};
return int highByte<128)?A:(highByte<192)?B:
(highbyte<224)?C:((highbyte <240)?D:E;
}
static void printRemote Address (String name) {
try {
System.out.println (cauta+name+);
InetAddress machine = InetAddress.getByName (name);
System.out.println (nume:+ machine.HostName());
System.out.println(IP:+machine.getHostAddress());
System.out.println(clasa:+ipClassmachine.getAddress());
}
catch(UnknownHostException ex {
system.out.println {nu gaseste hostul + name);
}

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

103

REELE LOCALE DE CALCULATOARE


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.
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 - creeaz 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 creeaz
un obiect URL din reprezentarea string dat.
2.3. Socketuri TCP
2.3.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:
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.
104

PROGRAMAREA N REEA FOLOSIND SOCKETURI JAVA (2)


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.
Exemplul 2
Descrcarea paginilor web folosind socketuri
Programul conine o bucl de ateptare a unui URL pentru care se creeaz un obiect care ateapt
conectarea la serverul web pentru a descrca i afia pagina cerut. Trebuie remarcat faptul c
acelai rezultat se obine utiliznd o implementare folosind clasa URL.
import java.net. * ;
import java.io. * ;
public class GrabPage {
//public Grabpage (String textURL)throws IOException..
//public void grab () throws IOException
//public static void main (String[] args ) throws IOException
public GrabPage (String textURL) throws IOException {
dissect (textURL);
}
//protected void dissect (String textURL) throws MalformedURLException..

.
protected String host, file ;
protected int port ;
protected void dissect (String textURL)throws MalformedURLException {
URL url = new URL (textURL) ;
host = url.getHost () ;
port = url.getPort () ;
if (port == -1)
port = 80;
file = url.getFile() ;
}
public void grab () throw IOException {
connect () ;
try {
fetch ();

105

REELE LOCALE DE CALCULATOARE


} finally {
disconnect () ;
}
}
//protected void connect ()( throws IOexception
//protected void fetch() throws IOException
//protected void disconnect () throws IOException
..
protected Writer writer;
protected BufferedReader reader ;
protected void connect ()throws IOException {
Socket socket = new socket (host, port) ;
OutputStream out = socket.getOutputStream() ;
writer new OutputStreamWriter (out,latin1) ;
InputStream in=socket.getInputStream () ;
Reader reader = new InputStreamReader (in, latin1) ;
this.reader = new BufferedReader (reader) ;
protected void fetch () throws IOException{
writer.write( GET + file +HTTP/1.0\r\n\n);
writer.flush();
PrintWriter console = new PrintWriter (System.out);
String input ;
while ((input = reader.readLine ())!=null)
console.println (input);
console.flush() ;
}
protected void disconnect() throws IOException{
reader.close ();

si deasemenea clientul care asteapta preluarea unui URL, la EOF se va iesi din bucla folosind break.
public static void main(String{}args throws IOException{
Reader kbd = new FileReader (FileDescriptor.in);
BufferedReader bufferedKbd = new BufferedReader (kbd) ;
while true( {
String textURL ;
System.out.print (introdu URL: );
System.out.flush () ;
if textURL = bufferedKbd.readline ()) == null)
Break ;
try {
GrabPage grabPage = new GrabPage (textURL);
GrabPage.grab ();
}catch {IOException ex) {
ex.printStackTrace () ;
continue;
}
System.out.println ( OK);

106

PROGRAMAREA N REEA FOLOSIND SOCKETURI JAVA (2)


}
System.out.println (exit);
}

2.3.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;
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.
107

REELE LOCALE DE CALCULATOARE


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().

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 sunt necesari 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.
Exemplul 3
Implementarea unui server de echo care accept conexiuni i apoi retransmite n ecou ceea ce a
recepionat.
import java.net.*
import java.io.*
Public class STServer{
Public static void main String[] args} throws IOException.
}
public static void main (String[] args)throws IOException
if args.length!=1)
throw new Illegal ArgumentException (exceptie);
Socket client = accept (Integer.parseInt(args[0]));
try{
InputStream in = client.getInputStream();
OuputStream out = client.getOutputStream();
out.write (esti conectat la server\r\n.getBytes (latin1)
int x;
While ((x=in.read())> -1)
Out.write (x);
}finally{
System.out.println (Inchide);
Client.close();
}
}
// static Socket accept (int port) throws IOException
Static Socket accept (int port) throws IOException {
System.out.println (porneste pe portul+port);
Server.Socket server = new ServerSocket (port);

108

PROGRAMAREA N REEA FOLOSIND SOCKETURI JAVA (2)

System.out.println (asteapta);
Socket client = server.accept();
System.out.println (acceptata de la +client.getInetAddress());
server.close();
return client;

Testarea serverului se poate realiza utilizand adresa de loopback.127.0.0.1


Exemplul 4
Server multithread care conine un thread ce va deservi acceptarea conexiunilor, i un alt thread care
va deservi conexiunile existente.
import java.net.*
import java.io.*
Public class MTEerver extends Thread{
//MTEchoServer(Socket socket).
//public void run()
//public static void main (String{} args) throws IOException
}
protected Socket socket
MTEchoServer (Socket socket){
this.socket=socket;
public void run(){
try {
InputStream in = socket.getInputStream();
OuputStream out = socket.getOutputStream();
out.write (esti conectat la server multithread\r\n.getBytes (latin1)
byte[] buffer = new byte [1024];
int read;
while ((read = in.read (buffer))>=0)
out.write (buffer,0,read);
}catch (IOException ex){
ex.printStackTrace ();
}finnaly{
try{
socket.close();
}catch (IOException ignored){
}
}
}
public static void main (String{}args)throws IOException{
if (args.length!=1)
throw new IllegalArgument Exception (MTEchoServer<>);
System.out.println (Porneste ps portul+args{)};
ServerSocket server = new ServerSocket(Integer.ParseInt (args{)}));
While (true){
Socket client= server.accept();
MTEchoServer echo = new MTEchoServer(client);

109

REELE LOCALE DE CALCULATOARE


Echo.start();
}
}

Exemplul 5. Implementarea unui server neblocant NB, folosind metoda


available().
import java.net.*;
import java.io.*;
Public class NBServer{
//public static void main(String[] args) throws IOException
}
static InputStream in0, in1;
static OutputStream out0, out1;
public static void main (String[] args ) throws IOException{
if(args.length !=1)
throw new IllegalArgumentException (Server: port);
try{
accept (Integer.pardeInt (args[0]));
int x0, x1;
while (((x0 = readNB(ino))!=-1&&
((x1=readNB (in1))!=-1)){
if (x0>=0)
out1.write (x0);
if (x1>=0
out0.write (x1);
}
}finally{
System.out.println (inchide);
close(out0);
close(out1);
}
}
static void close (OutputStream out){
if (out !=null){
try{
out.close();
}catch(IOException ignores{
}
}
}
//static void accept (int port throws IOException
//static int (readNB *InputStream in)
static void accept(int port)throws IOException{
System.out.println se porneste pe portul +port);
ServerSocket server = new ServerSocket(port);
try{
System.out.println asteapta);
Socket client0 =server.accept ();

110

PROGRAMAREA N REEA FOLOSIND SOCKETURI JAVA (2)

System.out.println de la clientul +client0.getInetAddress());


in0 = client0.getInputStream();
out0= client0.getOutputStream();
out0.write (hello, asteapta te rog\r\n.get.Bytes (latin1));
System.out.println (asteapta);
Socket.client1 = server.accept ();
System.out.println (accepta de la+client1.getInetAddress());
in1 = client.getInputStream();
out1= client1.getOutputStream();
out1.write (hello\r\n.getBytes(latin1));
out1.write (porneste\r\n.getBytes(latin1));
{finally{
server.close();

}
static int readNB (InputStream in) throws IOException{
if (in.available()>0)
return in.read();
else
return 2;
}

2.4. Socketuri datagrame


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.
2.4.1 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.
111

REELE LOCALE DE CALCULATOARE


Metodele acestei clase sunt:
GetAddress() returneaz obiectul InetAddress reprezentnd adresa hostului
remote;
GetPort() - returneaz portul datagramei pe maina remote;
GetLength() - returneaz lungimea datagramei (numr de bytes);
GetData() returneaz un tablou care conine datele transferate folosind
datagrame.
2.4.2 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.4.3 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

Secvena urmtoare reprezint utilizarea datagramelor Java pentru a recepiona un pachet de date.
Se creeaz un socket de tip datagram DatagramSocket, la un port specificat.
Exemplul 5
Socket = new DatagramSocket (.);

byte[] buffer = new byte [65508]


datagramPacket packet = new DatagramPacket (buffer,buffer.length);

socket.receive(packet);
..
socket.close()

.
InetAddress address = packet.getAddress();
Int fromPort = packet.getPort() ;
Int legth = packet.getLength() ;

112

PROGRAMAREA N REEA FOLOSIND SOCKETURI JAVA (2)


Byte[] data = packet.getData() ;

La construirea unui pachet datagram trebuie s se specifice adresa IP i portul destinaie pentru ca
acesta s poat fi transmis. Exemplul urmtor ilustreaz acest aspect astfel:
DatagramSocket packet = new DatagramSocket ();
DatagramPacket packet = newDatagramPacket
(data,data.length,InetAddress.getbyName (www.utcluj.ro,1728) ;
Socket.send(packet) ;
Socket.close();

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


113

REELE LOCALE DE CALCULATOARE


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
multicastGroup, multicastPort) ;
Socket.send (packet, (byte) 64 ) ;
Socket.close () ;

(data,

data.length,

Corespunztor,secvena pentru recepia unui pachet n mod multicast este:


// 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. Desfurarea lucrrii
3.1. Proiectai o aplicaie Java care s implementeze comanda finger. Clientul se conectez la server
la portul 79 i transmite o linie cu o interogare terminat cu perechea CR_LF la care serverul
rspunde.
3.2. 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.
114

PROGRAMAREA N REEA FOLOSIND SOCKETURI JAVA (2)


3.3. 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.4. 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.
3.5.S se implementeze o aplicaie care s realizeze comunicarea ntre doi aplei aflai n aceeai
pagin Web. Fiecare applet va conine dou butoane unul pentru actualizarea apletului n care se
gsete butonul, iar cel de al doilea pentru actualizarea celuilalt applet.
3.6. S se scrie un program care s trimit un mesaj de un byte unei maini server. S se calculeze
timpul mediu (round trip time) necesar transferului mesajului, considernd repetarea procesului de
un numr suficient de ori astfel nct s fie posibil o estimare medie. S se modifice dimensiunea
mesajului (1kb, 2kb, 4kb, 8kb) i s se calculeze debitul pentru fiecare dimensiune de mesaj.
Stabilii o relaie ntre laten, limea de band i
cerinele unei anumite aplicaii.
Notie

115

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