Pachetul java.net
Clase y6z18zm
ContentHandler
DatagramPacket
DatagramSocket
DatagramSocketImpl
HttpURLConnection
InetAddress
MulticastSocket
ServerSocket
Socket
SocketImpl
URL
URLConnection
URLEncoder
URLStreamHandler
Exceptii
BindException
ConnectException
MalformedURLException
NoRouteToHostException
ProtocolException
SocketException
UnknownHostException
UnknownServiceException
Interfete
ContentHandlerFactory
FileNameMap
SocketImplFactory
URLStreamHandlerFactory
Folosirea adreselor IP (Internet Protocol)
Clasa InetAdress
Furnizeaza mecanismul prin intermediul caruia sunt manipulate adresele IP.
Metode bytest getAddress( )
Returneaza adresa efectiva reprezentata de obiectul respectiv intr-un vector
de 4 octeti.Cel mai semnificativ octet se gaseste in getAddress()s0t.
Ex: s123, 45, 67, 89t
java.lang.String getHostAddress( )
Returneaza adresa efectiva sub forma unui sir “%d.%d.%d.%d”
Ex: “123.45.67.89” java.lang.String getHostName( )
Returneaza numele simbolic al adresei respective static java.net.InetAddress getLocalHost( ) throws java.net.UnknownHostException
Ex: xyz@thor.infoiasi.ro boolean isMulticastAddress( ) boolean equals( java.lang.Object obj ) static java.net.InetAddressst getAllByName( java.lang.String host ) throws java.net.UnknownHostException
Determina toate adresele unui claculator. (Daca un calculator este conectat
la mai multe retele el trebuie sa aiba cate o adresa IP pentru fiecare retea
la care este conectat). Parametrul host poate fi - fie numele masinii ex: java.sun.com
- fie un sir reprezentand adresa IP a masinii static java.net.InetAddress getByName( java.lang.String host ) throws java.net.UnknownHostException
Construieste adresa IP a unui calculator. int hashCode( ) java.lang.String toString( )
Intrucat acesata clasa nu are constructor public, pentru a crea o instanta
a unui obiect de tip InetAddress trebuie folosita una din metodele statice :
getLocalHost, getAllByName sau getByName, care apeleaza la randul lor cnstructorii
privati ai clasei.
Comunicarea prin protocoale orientate pe conexiune
Un protocol este o combinatie de reguli de comunicatie si formate de mesaje
care trebuie respectate de calculatoarele legate in retea pentru a schimba date.
Scopul primar al protocoalelor este de a permite comunicatia intre calculatoare,
indiferent de retea sau de hardware-ul calculatoarelor legate in retea.
O conexiune reprezinta un canal sigur de comunicatie in retea, stabilit de catre
un protocol pentru transmiterea corecta si in ordine a mesajelor intre calculatoare.
O conexiune este formata din doua fluxuri de date unidirectionale folosite pentru
comunicatie precum si din doua socluri (socket) care permit trimiterea, respectiv
receptia datelor. Orice conexiune este unic determinata de cele doua socluri
plasate la cele doua capete ale conexiunii.
Versiunea standard de Java foloseste pentru implementarea comunicatiei pe baza
de conexiuni protocolul TCP (Transmission Control protocol), unul din protocoalele
de baza ale familiei TCP/IP.
Modul de lucru cu soclurile se incadreaza in modelul client/server de scriere
de aplicatii, model in care aplicatiile se impart in doua categorii :
• programe client - cele care initiaza conversatia
• programe server - cele care ofera servicii programelor client
In virtutea acestui fapt, orice conexiune intre doua programe care comunica
prin retea este determinata unic de 4 elemente :
1. adresa gazdei pe care ruleaza aplicatia client
2. numarul de port al aplicatiei client
3. adresa gazdei pe care ruleaza aplicatia server
4. numarul de port pe care serverul primeste cererile
Un soclu Java poate lucra in doua moduri :
- direct - implicit (suficient pentru majoritatea aplicatiilor)
- cu facilitati speciale pe soclu, folosit de aplicatiile care necesita comunicarea
peste un zid de protectie (firewall) sau prin intermediul unui server proxy
Implementarea unui soclu (client sau server) se realizeaza prin extinderea clasei
abstracte SocketImpl.Metodele acestei clase pun la dipozitie instrumente de
comunicatie directa. Pentru a crea un soclu cu facilitati speciale este necesara
redefinirea metodelelor din aceasta clasa.
Clasa SocketImpl
Variabile
protected java.io.FileDescriptor fd
The file descriptor object for this socket. protected java.net.InetAddress address
The IP address of the remote end of this socket. protected int port
The port number on the remote host to which this socket is connected. protected int localport
The local port number to which this socket is connected.
Metode protected java.io.FileDescriptor getFileDescriptor( ) protected java.net.InetAddress getInetAddress( ) protected abstract java.io.InputStream getInputStream( ) throws java.io.IOException protected int getLocalPort( ) protected abstract java.io.OutputStream getOutputStream( ) throws java.io.IOException protected int getPort( )
java.lang.String toString( )
protected abstract void accept( java.net.SocketImpl s ) throws java.io.IOException
Accepta realizarea unei conexiuni protected abstract int available( ) throws java.io.IOException
Returneaza nr de octeti care pot fi cititi fara a bloca conexiunea protected abstract void bind( java.net.InetAddress host, int port ) throws java.io.IOException
Leaga conexiunea de un anumit partener specificat prin adresa IP si port protected abstract void close( ) throws java.io.IOException
Inchide o conexiune protected abstract void connect( java.net.InetAddress address, int port
) throws java.io.IOException
Realizeaza o conexiune cu un anumit partener protected abstract void connect( java.lang.String host, int port ) throws java.io.IOException protected abstract void create( boolean stream ) throws java.io.IOException protected abstract void listen( int backlog ) throws java.io.IOException
Stabileste numarul maxim de conexiuni admise protected native java.lang.Object clone( ) throws java.lang.CloneNotSupportedException protected void finalize( ) throws java.lang.Throwable
Programe de tip client
Clasa Socket abstractizeaza notiunea de soclu client (numit in general soclu)
si este responsabila de majoritatea operatiilor necesare comunicatiei in retea.
Prin instantierea unui obiect de tip Socket, programul client poate sa initieze
o conexiune (prin constructor) si sa implementeze comunicatia prin retea.
Structura unei aplicatii client bazate pe conexiuni
1. Initializari
2. Are facilitati speciale de soclu Da - Schimbare comportament prin SocketImpl
3. Creare soclu de comunicare si stabilire conexiune
4. Obtinere fluxuri de comunicare cu partenerul
5. Prelucrari specifice aplicatiei client
6. Este ultimul utilizator al soclului Da - Inchidere soclu
7. Faza finala a executiei
Clasa Socket
Constructori protected Socket( )
Creeaza o conexiune fara nici un partener specificat protected Socket( java.net.SocketImpl impl ) throws java.net.SocketException public Socket( java.net.InetAddress address, int port ) throws java.io.IOException
Creates a socket and connects it to the specified port number at the specified
IP address. public Socket( java.lang.String host, int port ) throws java.net.UnknownHostException, java.io.IOException public Socket( java.net.InetAddress host, int port, boolean stream ) throws
java.io.IOException
If the stream argument is true, this creates a stream socket. If the stream
argument is false, it creates a datagram socket. public Socket( java.lang.String host, int port, boolean stream ) throws java.io.IOException
public Socket( java.lang.String host, int port, java.net.InetAddress localAddr, int localPort ) throws java.io.IOException
The Socket will bind() to the local address and port supplied. public Socket( java.net.InetAddress address, int port, java.net.InetAddress localAddr, int localPort ) throws java.io.IOException
Metode
java.net.InetAddress getInetAddress( ) java.io.InputStream getInputStream( ) throws java.io.IOException
Obtine fluxul de intrare de la care pot fi citite datele din acest soclu. java.net.InetAddress getLocalAddress( ) int getLocalPort( ) java.io.OutputStream getOutputStream( ) throws java.io.IOException
Obtine fluxul de iesire prin care pot fi scrise datele int getPort( ) static synchronized void setSocketImplFactory( java.net.SocketImplFactory fac ) throws java.io.IOException
int getSoLinger( ) throws java.net.SocketException synchronized int getSoTimeout( ) throws java.net.SocketException synchronized void setSoTimeout( int timeout ) throws java.net.SocketException boolean getTcpNoDelay( ) throws java.net.SocketException void setTcpNoDelay( boolean on ) throws java.net.SocketException
synchronized void close( ) throws java.io.IOException void setSoLinger( boolean on, int val ) throws java.net.SocketException java.lang.String toString( )
Programul tip server
Serverul este programul care asculta cererile venite de la clienti si le ofera
serviciul pentru care a fost creat. Identificarea serverelor se face prin intermediul
portului pe care serverul asteapta cererile de conexiune venite din partea clientilor.
Majoritatea serviciilor foarte des folosite in Internet au asociate porturi
standardizate, pentru a permite clientilor sa opereze cu diferite servere in
vederea obtinerii unui serviciu.
Exemple de numere de porturi standardizate :
Serviciu Port asociat
Posta electronica 25
Transfer de fisiere 21
Telnet 23
Finger 79
WWW 80
Ecou 7
Executie la distanta (rexec) 512
POP3 (Post Office Protocol) 110
Primul lucru pe care trebui sa-l faca un program server este sa se asocieze
portuluistabilit la momentul proiectarii aplicatiei si sa initieze ascultarea
cererilor de servicii venite de la clienti. Aceste lucruri se realizeaza prin
constructorul clasei ServerSocket, clasa care implementeaza soclul programului
server.
Un lucru esential in proiectarea unei aplicatii server este faptul ca aceasta
trebuie construita in asa fel incat sa poata prelucra in paralel cererile clientilor.
Acest lucru se realizeaza prin folosirea mai multor fire de executie, fiecare
fir de executie ocupandu-se cu un singur client. De asemenea este prevazut un
mecanism pentru a limita numarul de cereri care pot fi prelucrate in paralel
si deci si numarul firelor de executie care ruleaza la un moment dat. Implicit
acest numar este 50, dar poate fi specificat ca argument al constructorului.
Orice cerere noua va fi respinsa daca numarul de cereri prelucrate are valoarea
maxima specificata.
Structura unei aplicatii server bazate pe conexiuni
1. Initializari
2. Are facilitati speciale de soclu Da - Schimbare comportament prin SocketImpl
3. Creare soclu server pentru ascultare cereri
4. Ascultarea continua Nu - Inchidere soclu
Faza finala
5. Ascultare cereri conexiuni
6. Acceptare cerere si obtinere soclu pentru comunicare
7. Creare fir de executie pentru tratarea conexiunii
7.1. Initializare fir tratare conexiune
7.2. Prelucrare conforma cu protocolul textului
7.3. Inchidere soclu comunicare
7.4. Terminare fir tratare conexiune
8. GOTO 4
Clasa ServerSocket
Constructori
public ServerSocket( int port ) throws java.io.IOException
Creates a server socket on a specified port. A port of 0 creates a socket on
any free port.
The maximum queue length for incoming connection indications (a request to connect)
is set to 50.
public ServerSocket( int port, int backlog ) throws java.io.IOException
public ServerSocket( int port, int backlog, java.net.InetAddress bindAddr ) throws java.io.IOException
Create a server with the specified port, listen backlog, and local IP address
to bind to. The bindAddr argument can be used on a multi-homed host for a ServerSocket
that will only accept connect requests to one of its addresses. If bindAddr
is null, it will default accepting connections on any/all local addresses. The
port must be between 0 and 65535, inclusive.
Metode
java.net.InetAddress getInetAddress( ) int getLocalPort( ) static synchronized void setSocketFactory( java.net.SocketImplFactory fac ) throws java.io.IOException synchronized int getSoTimeout( ) throws java.io.IOException synchronized void setSoTimeout( int timeout ) throws java.net.SocketException
java.net.Socket accept( ) throws java.io.IOException void close( ) throws java.io.IOException java.lang.String toString( )
Comunicatia folosind datagrame
Datagramele reprezinta o cantitate de informatii trimisa prin intermediul unui
pachet independent fata de alte informatii. Fiecare pachet este transmis de
la o masina la alta doar pe baza informatiilor continute de el insusi. Pachete
trimise de la o destinatie catre aceeasi sursa pot ajunge pe rute diferite si
in orice ordine.
In cadrul implementarii standard Java, datagramele sunt transportate prin retea
folosind prototcolul UDP (User Datagram Protocol), unul din protocoalele de
baza ale familiei TCP/IP.
Avantaje:
• viteza de transfer mai mare
• adaptarea la conditiile de moment ale retelei (congestii, legaturi temporar
indisponibile, etc)
Dezavantaje : lucru mai dificil
Diferenta fata de comunicarea printr-un canal sigur oferita de metoda comunicatiei
prin conexiuni este ca, folosind datagrame, nu se stabileste o legatura permanenta
intre client si server. De fapt, chiar notiunile de client si server isi pierd
semnificatiile, intrucat ambele folosesc pentru comunicare acelasi tip de soclu,
implementat de clasa DatagramSocket. Clientul va fi aplicatia care incapsuleaza
o cantitate de date (cerere) intr-un pachet si o transmite unui partener, iar
server va fi aplicatia care primeste pachete de tip cerere si retrimite pachete
cu raspunsuri la cererile primite. In cazul in care un pachet se pierde, clientul
va retransmite cererea dupa un anumit interval de timp.
Pentru datagrame nu exista destinatii implicite, asadar in fiecare datagrama
trebuie specificate:
• adresa destinatie
• numarul portului la care se trimite datagrama
• continutul datagramei
In Java, acese informatii sunt concentrate in obiecte de tip DatagramPacket.
Structura unei aplicatii bazate pe datagrame
1. Initializari
2. Are facilitati speciale de soclu Da - Schimbare comportament prin DatagramSocketImpl
3. Creare soclu datagrame
4. Care este actiunea urmatoare Transmisie
Producere date
Incapsulare date in pachet
Trimitere date
Receptie
Creare pachet receptie date
Receptie date
Prelucrare date
5. Este ultimul utilizator al soclului Nu - GOTO 4
Da -
Inchidere soclu
Faza finala
Clasa DatagramPacket
Constructori public DatagramPacket( bytest ibuf, int ilength )
Construieste un obiect pentru receptionarea pachetelor de lungime ilength. Obs:
ilength <a ibuf.length
public DatagramPacket( bytest ibuf, int ilength, java.net.InetAddress iaddr,
int iport )
Construieste un obiect pentru trimiterea de pachete de lungime ilength spre
gazda si portul specificate.
Metode
synchronized java.net.InetAddress getAddress( )
Returneaza adresa IP la care datagrama este trimisa sau de la care a fost receptionata synchronized void setAddress( java.net.InetAddress iaddr ) synchronized bytest getData( )
Returneaza datele care sunt trimise sau care au fost receptionate synchronized void setData( bytest ibuf ) synchronized int getLength( )
Returneaza lungimea pachetului care va fi trimis sau care a fost receptionat synchronized void setLength( int ilength ) synchronized int getPort( )
Returneaza numarul portului la care datagrama este trimisa sau de la care a
fost receptionata synchronized void setPort( int iport )
Clasa DatagramSocket
Constructori public DatagramSocket( ) throws java.net.SocketException
Constructs a datagram socket and binds it to any available port on the local
host machine. public DatagramSocket( int port ) throws java.net.SocketException
Constructs a datagram socket and binds it to the specified port on the local
host machine. public DatagramSocket( int port, java.net.InetAddress laddr ) throws java.net.SocketException
Creates a datagram socket, bound to the specified local address. The local port
must be between 0 and 65535 inclusive.
Metode
java.net.InetAddress getLocalAddress( ) int getLocalPort( ) synchronized int getSoTimeout( ) throws java.net.SocketException synchronized void setSoTimeout( int timeout ) throws java.net.SocketException
void close( ) synchronized void receive( java.net.DatagramPacket p ) throws java.io.IOException void send( java.net.DatagramPacket p ) throws java.io.IOException
Transferul de documente din WWW
Adresele prin care sunt localizate documentele se numesc URL-uri (Uniform Resource
Locator). Ele permit identificarea unica a unui document pe baza urmatorilor
parametri :
• protocolul prin care se transfera documentul
• serverul care gazduieste documentul
• numarul de port, daca este diferit fata de cel implicit folosit de protocol
• directorul in care se afla documentul
. numele fisierului in care este plasat documentul
Mai mult, este posibila identificarea chiar a unor sectiuni din documentul respectiv.
Folosirea adreselor URL se realizeaza prin intermediul clasei URL.
Clasa URL
Constructori public URL( java.lang.String spec ) throws java.net.MalformedURLException
public URL( java.lang.String protocol, java.lang.String host, int port, java.lang.String file ) throws java.net.MalformedURLException
...
Metode
final java.lang.Object getContent( ) throws java.io.IOException java.lang.String getFile( ) java.lang.String getHost( ) int getPort( ) java.lang.String getProtocol( ) java.lang.String getRef( ) static synchronized void setURLStreamHandlerFactory( java.net.URLStreamHandlerFactory fac )
java.net.URLConnection openConnection( ) throws java.io.IOException final java.io.InputStream openStream( ) throws java.io.IOException boolean sameFile( java.net.URL other ) java.lang.String toExternalForm( ) java.lang.String toString( )