Sunteți pe pagina 1din 38

Proiectarea Aplicaiilor n Reele de Calculatoare

Socluri n Java Java Sockets

Cuprins
Introducere Socluri Berkley (Berkley Sockets) Socluri Java (Java Sockets) java.net
Java Datagram Socket Buffered Socket Data Stream Socket Secure Sockets

Recapitulare!
Fluxuri Java (Java Streams) java.io Fire de execuie (Java Threads)

Introducere
Pachetul java.net permite dezvoltarea de aplicaii Java n reea furniznd dou servicii de comunicaii:
un set de clase pentru descrcarea i manipularea obiectelor URL o implementare nativ a soclurilor Berkley

Berkley Sockets
Au fost introduse n 1981 n Unix BSD 4.2 ca i o interfa generic pentru comunicarea interprocese (IPC) Unix-to-Unix. Reprezint primul protocol de comunicare peerto-peer peste stiva de protocoale TCP/IP suportat n acest moment de orice sistem de operare:
parte a kernelului n Unix BSD
servicii de sine stttoare servicii IPC n reea

WinSock API n cazul sistemelor Windows biblioteci specializate pentru alte sisteme sisteme de operare

Sockets
Caracteristici ale soclurilor:
reprezint captul unui canal de comunicaie peer-topeer au un nume i o adres de reea din punctul de vedere al programatorului, soclurile ascund detaliile privind reeaua

Tipuri de socluri:
flux (stream) datagram (datagram) neprelucrat (raw)

Stream Sockets
Furnizeaz interfaarea cu protocolul de transport orientat-pe-conexiune: TCP. Garanteaz c pachetele de date sunt transmise fr erori, fr duplicate i sunt recepionate n ordinea n care au fost trimise. Datele sunt considerate a fi sub forma unui flux continuu de octei fr limit n ceea ce privete dimensiunea. Caracteristici TCP (recap.)
gestiunea conexiunii de date controlul fluxului reasamblarea pachetelor detecia erorilor

Datagram Sockets
Furnizeaz interfaarea cu protocolul neorientat pe conexiune: UDP. Toate problemele legate de sigurana transportului revin programatorului. Datele sunt considerate a fi mpachetate n datagrame de dimesniune limitat: max 32 KB. Caracteristici UDP (recap.)
utilizat pentru transmiterea de pachete independente fr a oferi nici o garanie n ceea ce privete
detecia duplicatelor secvenierea mesajelor confirmarea mesajelor

include o sum de control pentru detecia erorilor

Raw Sockets
Furnizeaz interfaarea cu protocoalele de nivel Internet: IP i ICMP. Nu ofer servicii peer-to-peer tradiionale. Sunt folosite pentru a testa noi protocoale de transport sau pentru a accesa faciliti avansate ale protocoalelor existente.

Identificarea soclurilor
Adresa unui soclu ntr-o reea TCP/IP const din dou pri:
Socket = Net_ID / Host_ID + Port_ID adresa IP: numr pe 32 bii poate fi nlocuit de numele de domeniu al hostului adresa de port: numr pe 16 bii

Adresa IP n Java
Este ncapsulat n clasa java.net.InetAddress Metode
public static InetAddress getByName(String host) throws UnknownHostException public static InetAddress[ ] getAllByName(String host) throws UnknownHostException public static InetAddress getLocalHost( ) throws UnknownHostException public byte[ ] getAddress( ) public String getHostName( )

1.
-

Comunicaia ntre socluri scenariu Crearea capetelor canalului de comunicaie


se apeleaz constructorul pentru crearea i iniializarea unui soclu

2.
-

Stabilirea unui port pentru servicii


se ataeaz soclul la un port unic pentru a fi recunoscut n reea

3.
-

Ascultarea portului pentru cereri de conexiune


serverul este gata s accepte conexiuni de la clieni eventual, se definete lungimea cozii pentru stocarea cererilor

4.
-

Conectarea la server
clientul iniializeaz o conexiune la portul deschis de server i poate rmne blocat pn primete acceptul

5.
-

Acceptarea conexiunii
serverul accept prima conexiunea din coad (care e la rnd) i pornete un nou fir de execuie pentru a trata cererile acelui client

6.
-

Transferul de date
datele ce trebuie comunicate sunt trimise i recepionate n ambele direcii

7.
-

nchiderea soclurilor
clientul i serverul nchid capetele conexiunii
Atenie! Soclurile reprezint resurse limitate i trebuie gestionate cu grij

Comunicaia ntre socluri - diagrama Procesul client: Procesul server: 1. Socket() 2. bind() 3. listen() ncepe ncepe fir 5. accept() sesiune TCP de execuie accept() (alt client, etc.) 6. read() write() 7. close()

1. Socket() 4. connect()

6. write() read() 7. close()

Java Sockets
Ierarhia de clase din pachetul java.net
java.lang Object java.net
DatagramSocket DatagramPacket ServerSocket Socket SocketImpl (abstract)

Clasele Java pentru Datagram Sockets


DatagramPacket
implementeaz un container pentru un pachet (datagram) pachetul poate fi trimis sau recepionat

DatagramSocket
implementeaz un soclu pentru transmiterea i recepionarea datagramelor

Clasa DatagramPacket
Constructori
public DatagramPacket(byte ibuf[], int ilength) public DatagramPacket(byte ibuf[], int ilength, InetAddress iaddr, int port)

Metode
public InetAddress getAddress() public byte [ ] getDate() public int getLength() public int getPort()

Clasa DatagramSocket
Constructori
public DatagramSocket() throws SocketException public DatagramSocket(int port) throws SocketException

Metode
public void close() public int getLocalPort() public void receive(DatagramPacket p) throws IOException public void send(DatagramPacket p) throws IOException public void finalize()

Scenariul pentru comunicarea cu datagrame (1)


1. Se creeaz capetele canalului de comunicaie 2. Serverul creeaz pachetul ce trebuie recepionat 3. Clientul creeaz pachetul ce trebuie trimis 4. Serverul ateapt sosirea datagramelor 5. Clientul trimite datagrama 6. Serverul recepioneaz datagrama

Scenariul pentru comunicarea cu datagrame (2)


7. Clientul creeaz pachetul ce trebuie recepionat 8. Clientul ateapt rspuns de la server 9. Serverul creeaz pachetul ce trebuie trimis 10. Serverul trimite datagrama rspuns 11. Clientul obine rspunsul 12. Se nchide canalul de comunicaie att de client ct i de server

Comunicarea cu datagrame - diagrama Client Datagram Socket new new send mesaj receive getData In Packet In Packet Server Datagram Socket new new Out Packet Out Packet

new receive getData close

new send close

Clasele Java pentru Stream Sockets


Socket
implementeaz un soclu cu flux este utilizat att de client ct i de server pentru a obine acces la canalul de comunicaie

ServerSocket
este utilizat de server pentru a asculta cererile de conexiune venite din partea clienilor

SocketImpl
clas abstract care definete metodele JDK pentru lucrul cu socluri ce trebuie implementate indiferent de platform

Clasa Socket (1)


Constructori
public Socket() public Socket (InetAddress addr, int port) throws IOException public Socket (String host, int port) throws UnknownHostException, IOException public Socket (InetAddress addr, int port, InetAddress localAddr, int localPort) throws IOException public Socket (String host, int port, localAddr, int localPort) throws IOException

Clasa Socket (2)


Metode
public InetAddress getInetAddress() public int getPort() public int getLocalPort() public InputStream getInputStream() throws IOException public OutputStream getOutputStream() throws IOException public void close() throws IOException

Clasa ServerSocket (1)


Constructori
public ServerSocket() public ServerSocket(int port) throws IOException public ServerSocket(int port, int backlog) throws IOException public ServerSocket(int port, int backlog, InetAddress addr) throws IOException

Clasa ServerSocket (2)


Metode
public Socket accept() throws IOException public InetAddress getInetAddress() public int getLocalPort() public void close() throws IOException

Buffered-Stream Sockets
Datele ce trebuie transmise i recepionate prin reea se introduc / se extrag din fluxurile de ieire / intrare asociate soclului. Pentru mbuntirea performanelor se recomand utilizarea buffer-elor
numrul de operaii cu fluxurile este redus prin citirea / scrierea blocurilor de octei

Buffered-Stream Sockets (1)


Scenariul din punctul de vedere al clientului
1. Creeaz un soclu client 2. Obine un flux de ieire OutputStream 3. Creeaz un filtru BufferedOutputStream pentru transmiterea mesajului 4. Obine un flux de intrare InputStream 5. Creeaz un filtru BufferedInputStream pentru recepia mesajului 6. Scrie n fluxul de ieire 7. Golete fluxul de ieire 8. Citete din fluxul de intrare 9. nchide canalul de comunicaie (soclul)

Buffered-Stream Sockets (2)


Diagrama din punctul de vedere al clientului
Client Socket create getOutputStream create BufferedInputStream getInputStream create write flush read close BufferedOutputStream

Buffered-Stream Sockets (3)


Scenariul din punctul de vedere al serverului
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Creeaz un soclu pentru server Ateapt cererea clientului Accept cererea clientului Obine un flux de ieire OutputStream Creeaz un BufferedOutputStream pentru transmiterea mesajului ctre client Obine un flux de intrare InputStream Creeaz un BufferedOutputStream pentru recepia mesajului de la client Citete din fluxul de intrare Scrie n fluxul de ieire Golete fluxul nchide canalul de comunicaie (soclul)

Buffered-Stream Sockets (4)


Diagrama din punctul de vedere al serverului
Server ServerSocket create accept getOutputStream create getInputStream create read write flush close create BufferedOutputStream BufferedInputStream Socket

Raw Sockets
J2SDK API nu suport acest tip de socluri! Alternative:
Implementarea n alte limbaje de programare (de ex. C/C++) Utilizarea API-ului Jpcap http://jpcap.sourceforge.net/ http://netresearch.ics.uci.edu/kfujii/jpcap/doc/

Socluri securizate
Criptarea datelor vehiculate prin socluri poate asigura:
securizarea comunicrii n reea, confidenialitatea comunicrii autentificarea clienilor i a serverelor, etc.

JSSE Java Secure Sockets Extension


inclus n JDK v > 1.4 utilizeaz protocoalele i algoritmii asociai
Secure Sockets Layer (SSL) v3 Transpor Layer Security (TLS)

Pachete JSSE
javax.net.ssl
conine clasele abstracte care definesc API-ul pentru comincarea securizat n reea

javax.net
conine clasele abstracte pentru fabrica de socluri
aceste clase pot fi folosite n locul constructorilor pentru crearea soclurilor securizate

javax.security.cert / java.security.cert
conine un set minimal de clase pentru manipularea certificatelor cu cheie public

com.sun.net.ssl
conine clasele care implementez algoritmii de criptare i protocoalele corespunztoare conform Sun tehnic vorbind, nu face parte din JSSE deci poate fi nlocuit cu orice alt implementare

Crearea soclurilor client securizate


Clasa SSLSocket
public abstract class SSLSocketFactory extends SocketFactory public static SocketFactory getDefault( ) throws InstantiationException public abstract Socket createSocket(String host, int port) throws IOException, UnknownHostException public abstract Socket createSocket(InetAddress host, int port) throws IOException public abstract Socket createSocket(String host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException public abstract Socket createSocket(InetAddress host, int port, InetAddress interface, int localPort) throws IOException, UnknownHostException

Metodele clasei SSLSocket


Alegerea suitei de cifruri
public abstract String[] getSupportedCipherSuites() public abstract String[] getEnabledCipherSuites() public abstract void setEnabledCipherSuites(String[] suites)

Gestiunea evenimentelor n cazul n care se dorete tratarea asincron a conexiunii


public interface HandshakeCompletedListener extends java.util.EventListener public void handshakeCompleted(HandshakeCompletedEvent event) public abstract void addHandshakeCompletedListener( HandshakeCompletedListener listener)

Crearea soclurilor server securizate


Clasa SSLServerSocket
public abstract class SSLServerSocketFactory extends ServerSocketFactory public static ServerSocketFactory getDefault( )
suport doar autentificare general pe server, nu i criptare!

public abstract ServerSocket createServerSocket(int port) throws IOException public abstract ServerSocket createServerSocket(int port, int queueLength) throws IOException public abstract ServerSocket createServerSocket(int port, int queueLength, InetAddress interface) throws IOException

Iniializarea i configurarea complet a unui soclu server securizat


Se genereaz cheile publice i certificatele folosind keytool Se pltete pentru autentificarea ceritificatelor unei firme tere (de ex. Verisign) Se creeaz un SSLContext pentru algoritmul de criptare utilizat Se creeaz un TrustManagerFactory pentru sursa certificatului utilizat Se creeaz un KeyManagerFactory pentru tipul de chei utilizate Se creeaz un obiect KeyStore petru baza de date ce conine cheile i certificatele Se ncarc obiectul KeyStore cu chei i certificate Se iniializeaz KeyManagerFactory Se iniializeaz contextul cu toate datele necesare

Metodele clasei SSLServerSocket


Alegerea suitei de cifruri
public abstract String[] getSupportedCipherSuites( ) public abstract String[] getEnabledCipherSuites() public abstract void setEnabledCipherSuites(String[] suites)

Specificarea autentificrii pentru clieni (Client mode)


public abstract void setNeedClientAuth(boolean flag) public abstract boolean getNeedClientAuth( )

Bibliografie
Capitolul 10 din R. Orfali, D. Harkey, Client/Server Programming with Java and CORBA, John Wiley & Sons, 1997 E.R. Harold, Java Network Programming, OReilly, 2004

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