Sunteți pe pagina 1din 6

InetAddress utilizata pentru reprezentarea adreselor IP

-obiectele inetaddress nu se creaza cu ajutorul constructorilor ci cu ajutorul


unor metode statice
-avantajul consta in fapotul ca varianta cu metode statice permite sa se
verifice initial daca nu exista deja un obiect ce reprezinta acea interfata, iar in
caz afirmativ metoda poate returna o referinta catre acel obiect, evitandu-se
astfel duplicatele
-varianta cu constructor ar crea de fiecare data un obiect nou
ex: static InetAddress getLocalHost() - interfata de comunicatie a
calculatorului
ex: static InetAddress[] getAllByName(String nume) -returneaza un tablou de
tip inetaddress completat cu referinte catre obiecte ce reprezinta toate
interfetele de comunicatie ale calculatorului; exista un param string, prin care
trebuie sa se specifice numele unei interfete, fie in format numerit, fie in
format simbolic
ex: String getHostName() -returneaza numele interfetei ,adica fie adresa IP in
format simbolic, fie numele calculatorului in sistemul de operare Windows
ex: string getHostAddress- returneaza adresa IP in format numeric; se
gaseste in pachetul java.net
File->new project->Java application->Finish

try{
InetAddress adr=InetAddress.getLocalHost();
InetAddress[] toate=InetAddress.getAllByName(adr.getHostName());
for (int =0;i<toate.length;i++){
System.out.println("\n Interfata nr."+i+"are adresa ip
"+toate[i].getHostAddress() +"si numele:" + toate[i].getHostName());
}
} catch {....}

Clasa Server Socket

-aceasta clasa se poate utiliza pentru a crea o aplicatie care sa accepte


cereri de stabilire a unei conexiuni ;pentru ca accepta ceva si nu solicita ceva
o putem numi aplicatie server; in acest model in care se utilizeaza TPC/IP este
necesar ca inainte de inceperea comunicatiei sa se stabileasca o conexiune
intre partile care comunica iar procedeul prin care se stabileste conexiunea
se numeste tri-way-handshake
-in Java pe calculatorul care asteapta cererile de conexiune trebuie sa existe
un obiect de tip server socket
-clasa server socket are mai multi constructori
ex: ServerSocket(int port) -acel parametru specifica nr de port pe care sunt
asteptate cererile de conexiune( e un nr intreg pana la 65000)(backLog este
implicit)
ex: ServerSocket ( int port , int backLog) -backLog este dimensiunea unei
cozi de asteptare in care sunt plasate cererile care nu pot fi deservite pe
loc(nu reprezinta numarul de clienti)
ex: ServerSocket(int port, int backLog, InetAddress bindAdr ) -util in cazul in
care exista mai multe interfete de comunicatie si putem sa specificam prin al
3-lea param care din interfete trebuie sa accepte cererile de conexiune ; in
cazul primelor 2 variante, cererile sunt acceptate indiferent de interfeta prin
care sosesc
Metoda accept()
-este apelata atunci cand dorim ca un obiect Serversocket sa astepte cereri
de conexiuni
-metoda se incheie in momentul in care soseste o cerere de conexiune
-returneaza un obiect de tip Socket
-acel obiect va fi utilizat de catre server pentru a comunica cu clientul care a
lansat cererea

Comunicatie efectiva se realizeaza prin obiecte Socket


Pentru a se stabili o conexiune prin TCP/IP intre 2 calculatoare, pe unul dintre
ele trebuie sa existe un obiect ServerSocket pentru care s-a apelat metoda
accept(); conexiunea se stabileste automat in momentul in care pe cel de-al
doilea calculator se creaza cu ajutorul unui constructor un obiect de tip
Socket

Metoda void close ()


-apelata in momentul in care serverul trebuie inchis , nu mai dorim sa se
accepte alte conexiuni
Metoda socket()
-nu au alte superclase decat Object
Constructori
Socket(InetAddress adr, int port) -adresa ip a interfetei calculatorului
server , cel de-al doile parametru de tip int reprezinta numarul de port pe
care asteapta calculatorul server cererile de conexiune, in cazul in care
reuseste crearea obiectului, socket, atunci conexiunea cu serverul este deja
stabilita, in caz contrar daca nu se poate crea obiectul atunci se lanseaza o
exceptie(fie din cauza unei erori de comunicatie, fie pentru ca serverul nu
este pornit)
Socket(String host, int port)
Socket(String host m int port, InetAddress adrLocala, int portLocal)
-al 3-lea param este adresa , deci este utila in cazul in care clientul are
mai multe interfete de comunicatie si dorim sa specificam pe care dintre
interfete sa fie transmisa cererea,
-ultimul param este numarul de port ce va fi folosit de aplicatia client
-pentru primele 2 variante de constructor nr de port se alege la
intamplare din cele disponibile
Observatie
Putem sa ne gandim la o conexiune ca fiind alcatuita din 2 socluri ce
identifica cele 2 capete, fiecare soclu este determinat printr-o adresa IP si un
numar de port
Metoda void close() - pentru a inchide conexiune si obiectul soclu
Metoda getInputStream()
Metoda getOutputStream()
-cu aceste metode putem sa creem niste fluxuri de intrare iesire cu ajutorul
carora sa citim date de la partenerul de comunicatie si sa trimitem date prin
retea
Metoda getInputStream returneaza un obiect de tip inputstream ce poate fi

folosit ca argument pentru constructorul unei clase mai sofisticate ce


reprezinta un flux de intrare
Metoda getOutputStream returneaza un flux de iesire de tip outputstream ce
se foloseste de obicei ca argument pentru constructorul unei clase mai
sofisticate (de ex printStream)
Exemple de metode folosite pentru fine-tuning
getReceiveBufferSize()
getSendBufferSize()
setReceiveBufferSize()
Metoda getLocalPort() -returneaza numarul de port utilizat de soclul local, nu
cel de la distanta
Metoda getPort- putem sa aflam numarul de port al soclului indepartat
Metoda getInetAddress() rezultat de tip getInetaddress-putem sa aflam
adresa IP a soclului indepartat

Exemplu de comunicatie client server


Server de fisiere
-prima componenta: serverul
-import java.net.*;
import java.io.*;
-public class TestNet extends Thread (este derivata din clasa thread pentru ca
dorim sa cream mai multe fire de executie)
-main
ServerSocket ss;
try {
ss-new ServerSocekt(1234,10);
} catch (IOException e){
System.out.println("eroare creare soclu");
return;}

try {
while (true){
new TestNet (ss.accept()); //la fiecare iteratie a buclei se creaza cate un fir de
executie
//argumentul pentru constructor este rezultatul metodei accept()
//fiecare iteratie a buclei while se incheie in momentul in care soseste o
cerere de la un //client dupa care urmeaza o alta iteratie care iar astepta o
cerere s.a.m.d.
}
}catch (IOException e){}
}//gata main
Socket s //rezultatul metodei accept(socketul cu care va comunica cu
clientul)
TestNet(Socket s){ //constructorul ;
this.s=s;//rezultatul lui accept() e pus in s
start(); //firul se autolanseaza in executie
}
//Tema :recapitulare cap 2 la Java si firele de executie
//Metoda run()- cand se termina run se termina si firul de ex
public void run(){
System.out.println("Conexiune pe portul "+s.getLocalPort());
System.out.println("Conexiune cu
clientul :"+s.getInetAddress().getHostAddress());
String text;
try {
DataInputStream dis=new DataInputStream(s.getInputStream());
//cream un flux de intrare cu care putem citi mesajele de la client
String numef=dis.readLine();//citim o linie de text de la client care reprezinta
numele //fisierului solicitat de catre client

System.out.println("-->+numef");
PrintStream ps = new PrintStream(s.getOutputStream());
//cream un flux de iesire cu care trimitem msj catre client
DataInputStream fis=new DataInputStream(new FileInputStream(numef));
//deschidem fisierul solicitat de cleint cu un flux de intrare de tip
datainputstream

while (fis.available()!=0){
//cat timp nu am ajuns la sf fisierului citim o linie din fisierul de intrare si o
trimitem pe fluxul //de iesire
linie=dis.readLine();
ps.println(linie);
}
ps.println(".");//semnalizare sfarsit fisier
} catch (IOException e){ System.out.println("Eroare e");}
}
}

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