Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il...
-
Upload
trinhquynh -
Category
Documents
-
view
226 -
download
0
Transcript of Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il...
1
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
A.A. 2003-04
Socket in Java
2
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Modelli di comunicazione
Connesso (stream-oriented)Basato sulla metafora del “tubo”Permette lo scambio di informazioni tra due partnerGarantisce la consegna ordinata ed affidabile di tutti i dati scambiatiRichiede ai sistemi operativi dei partner un certo impegno di risorse
Non connesso (datagram-oriented)Basati sulla metafora della “lettera”Possono consentire la comunicazione tra più partner (uno a uno o uno a molti)Non garantiscono nulla sulla consegnaRichiede ai sistemi operativi dei partner risorse limitate
2
3
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Modello connesso (1)
La comunicazione richiede tre fasi:1. Richiesta di connessione
Mittente e del destinatario allocano risorse per gestire il flusso di dati
2. Trasferimento di datiMittente e destinatario possono scambiarsi dati di dimensione arbitraria: il sistema operativo provvede a frammentare le informazioni in pacchetti, in modo trasparenteIn caso di ricezioni di pacchetti errati o di mancata consegna, viene gestita automaticamente la ritrasmissione
3. Rilascio della connessioneLe risorse vengono rilasciate
4
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
ReteRete
Modello connesso (2)
Indirizzo“ben noto”
Sock
etSo
cket
Client
FlussoinviatoFlussoricevuto
Server
Sock
etSo
cket Flusso
inviatoFlussoricevuto
3
5
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Modello non connesso (1)
Il mittente deve frammentare esplicitamente i dati in pacchetti
La dimensione massima è finitaOgni pacchetto riporta gli estremi di mittente e destinatarioI pacchetti possono essere inviati in qualunque momento
Non occorre pre-allertare il destinatarioNessuna indicazione automatica circa l’avvenuta consegna
6
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Modello non connesso (2)
Sock
etSo
cketInvia
messaggioRicevi
messaggioReteRete
Sock
etSo
cket Invia
messaggioRicevi
messaggio
4
7
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Protocolli di trasporto
Ogni architettura di rete definisce, a livello 4 (trasporto) del modello ISO/OSI, opportuni protocolli che permetto l’instaurarsi di comunicazioni secondo i due diversi modelliNel caso delle reti IP:
TCP (Transport Control Protocol) fornisce servizi orientati alla connessioneUDP (User Datagram Protocol) fornisce servizi di trasporto non connessi
8
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
ReteRete
Socket (1)
Astrazione delle terminazioni di una connessione di rete“A socket is defined to bethe unique identification to or from which information is transmittedin the network” (RFC 147 – 7 maggio 1971)Concetto nato in ambiente Unix per reti di tipo IP ed esteso a contesti differenti
5
9
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Socket (2)
Un’unica interfaccia, molti serviziNon solo TCP/IP…… ma anche SPX/IPX, IPv6, IrDa, OSI, NetBios, ecc.
Un socket è identificato univocamente dall’indirizzo a livello rete
o Nel caso IP v.4, 4 bytedal tipo di protocollo utilizzatodall’indirizzo a livello trasporto
o porta, nel caso di TCP e UDP
10
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Socket: pro e contro
VantaggiModello consolidatoIndipendente dalla piattaformaMassima flessibilità
SvantaggiMinimo livello di astrazione possibileTutte le funzionalità avanzate (sicurezza, bilanciamento del carico, individuazione dei possibili interlocutori, …) sono a carico del programmatore
6
11
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Socket in Unix
DataLink Layer
Stream Transport Layer
Stream Transport Layer
DatagramTransport Layer
DatagramTransport Layer
Network LayerNetwork Layer
Socket
12
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Socket in Unix
Un’unica interfaccia (struttura dati, funzioni) per una pluralità di comportamenti
“Raw socket” per connettersi direttamente al protocollo di rete“Stream socket” per modellare sia il ruolo di client che quello di server nei protocolli connessi“Datagram socket” per modellare comunicazioni orientate ai messaggi
Macchina a stati complessa per definire lo stato di ciascun socket
7
13
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Socket in Java
Un’insieme di classi specializzate in compiti distintiDefiniti nel package java.net
Rispetto al modello originale UNIX, molte semplificazioni ed alcuni limiti
Approccio ad oggettiClassi diverse modellano comportamenti diversiMacchina a stati semplificataNon è possibile accedere direttamente al protocollo di rete (non esistono socket di tipo “raw”)
14
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Classe ServerSocket
Rappresenta il punto di ingresso lato rete di un server connesso
Accetta richieste di connessione da parte dei clientA fronte di una richiesta, crea nel server un oggetto di classe Socket connesso con il client
Metodi fondamentali:public ServerSocket(int port) throws IOExceptionpublic Socket accept() throws IOExceptionpublic void close() throws IOException
8
15
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Classe Socket (1)
Rappresenta l’estremo di una comunicazione di tipo connessoPuò assumere tre stati:
Non ancora connesso (usato raramente)In connessioneDisconnesso
Quando è in connessione, permette di inviare e ricevere dati verso l’altro estremo
Rende disponibili oggetti di tipo InputStream e OutputStream con cui è possibile interagire
16
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Classe Socket (2)
Metodi fondamentali:public Socket(String host, int port)
throws UnknownHostException, IOException,SecurityException;
public InputStream getInputStream()throws IOException
public OutputStream getOutputStream()throws IOException
public void close() throws IOException()
9
17
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Server minimaleclass TrivialServer {
public static void main(String args[]) {
try {
ServerSocket ss= new ServerSocket(1234);
Socket s= ss.accept();
ss.close(); // verrà accettata un’unica connessione
BufferedReader br=new BufferedReader(
new InputStreamReader(s.getInputStream()));
System.out.println(br.readLine());
s.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
class TrivialServer {
public static void main(String args[]) {
try {
ServerSocket ss= new ServerSocket(1234);
Socket s= ss.accept();
ss.close(); // verrà accettata un’unica connessione
BufferedReader br=new BufferedReader(
new InputStreamReader(s.getInputStream()));
System.out.println(br.readLine());
s.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
18
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Client minimaleclass TrivialClient {
public static void main(String args[]) {
try {
Socket s= new Socket(“localhost”, 1234);
PrintWriter out =new PrintWriter(
s.getOutputStream(), true);
out.println(“Hello Socket World”);
s.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
class TrivialClient {
public static void main(String args[]) {
try {
Socket s= new Socket(“localhost”, 1234);
PrintWriter out =new PrintWriter(
s.getOutputStream(), true);
out.println(“Hello Socket World”);
s.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
10
19
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Scambio di dati (1)
I flussi di ingresso e uscita dei socket permettono lo scambio di dati con il partner remoto
Le comunicazioni sui due canali sono del tutto indipendenti e possono avvenire in qualsiasi ordine (canale di comunicazione full duplex)Per facilitare l’implementazione dei servizi, client e server si accordano (preventivamente) su un protocollo applicativo che definisce le regole che governano tale comunicazione:
o Si può parlare contemporaneamente? o Chi parla per primo? o Cosa è lecito dirsi?o …
20
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Scambio di dati (2)
Si opera sui flussi tramite i metodi elementari di InputStream e OutputStream o i loro derivati
int read()void write(int b)
Tali metodi sono bloccanti:Quando vengono invocati non ritornano fino a che l’operazione richiesta non è terminata (o abortita esplicitamente da una terza parte)
11
21
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Scambio di dati (3)
Per semplificare lo scambio di dati, spesso si utilizzano classi “filtro” specializzate nell’aggiungere funzionalità ulteriori
Reader/Writer: utilizzo di caratteri Unicode invece che byte come dati elementariBufferedInputSrteam/BufferedOutputStream: inserimento di un buffer per migliorare le prestazioniDataInputStream/DataOutputStream: metodi per la (de)codifica di dati più complessi…
22
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Struttura di un server (1)
Un processo server attende continuamente richieste che possono provenire da una molteplicità di client
Ogni richiesta deve essere gestita, restando in attesa di richieste ulterioriIl suo algoritmo è centrato su un ciclo:
boolean bContinue=true;
ServerSocket ss= new ServerSocket(port);
while (bContinue) {
Socket s= ss.accept();
handleRequest(s);
}
ss.close();
12
23
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Struttura di un server (2)
Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client
All’interno di questo metodo si elaboreranno i dati provenienti dal client e si gestirà opportunamente l’interazioneAl termine dell’interazione, il metodo ritorna e diventa possibile accettare una nuova richiesta da parte di un client differente
Cosa succede se, a causa di un malfunzionamento o di un errore di programmazione, il server non riesce a leggere un messaggio atteso da un client?E cosa capita se due client cercano di connettersi contemporaneamente al server?
24
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Socket: in profondità (1)
Ogni socket connesso è legato ad una portaAltrimenti i protocolli di rete non potrebbero recapitare i datiad esso destinati
Nel caso dei client, la porta spesso è irrilevanteAll’atto della costruzione, viene scelta la prima disponibileIl metodo int getLocalPort() permette di conoscerla
Ogni calcolatore può avere più di una scheda di reteNormalmente vengono creati socket che dialogano con la scheda “primaria”Nel costruttore è possibile specificare l’indirizzo della scheda da utilizzare e la relativa porta
13
25
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Socket: in profondità (2)I protocolli di trasporto spesso offrono una molteplicità di opzioni che ne precisano il comportamento
Per default, i socket utilizzano i valori baseÈ possibile conoscerli e specificarne di alternativi utilizzando appositi metodi
void setKeepAlive(boolean on);
void setOOBInline(boolean on);void setReceiveBufferSize(int size);void setReuseAddress(boolean on);void setSendBufferSize(int size);void setSoLinger(boolean on, int linger);void setSoTimeout(int timeout);void setTcpNoDelay(boolean on);void setTrafficClass(int tc);
void setKeepAlive(boolean on);
void setOOBInline(boolean on);void setReceiveBufferSize(int size);void setReuseAddress(boolean on);void setSendBufferSize(int size);void setSoLinger(boolean on, int linger);void setSoTimeout(int timeout);void setTcpNoDelay(boolean on);void setTrafficClass(int tc);
26
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
DatagramSocket (1)
Classe che modella un estremo di una conversazione non connessaOffre metodi per l’invio e la ricezione di pacchetti singoli
Nell’implementazione base, basata su UDP, la dimensione massima del pacchetto è 64KByte
Il protocollo applicativo deve farsi carico di aspetti di trasporto
Suddividere informazioni troppo grosse in pacchetti differentiNumerare i pacchettiVerificarne la consegna…
14
27
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
DatagramSocket (2)
Metodi fondamentali:public DatagramSocket(int port)throws SocketException, SecurityException;
public void send(DatagramPacket p)throws IOException;
public void receive(DatagramPacket p)throws IOException;
public void close();
28
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
DatagramPacket
Modella un singolo pacchetto scambiato all’interno di una comunicazione non connessaMetodi fondamentali:
public DatagramPacket(byte[ ] buf, int length);public DatagramPacket(byte[ ] buf, int length,
InetAddress address, int port);public byte[ ] getData();public int getOffset();public InetAddress getAddress();public int getPort();
15
29
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Invio di informazioniint LOCAL_PORT=…;
int remote_port=…;
InetAddress remote_address= new InetAddres(…);
byte[] buf= new byte[64000];
// buf viene riempito…
socket = new DatagramSocket(LOCAL_PORT);
packet = new DatagramPacket(buf, buf.length, remote_address, remote_port);
socket.send(packet);
//…
socket.close();
30
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Ricezione di informazioniint LOCAL_PORT=…;
int remote_port;
byte[] buf= new byte[64000];
InetAddress remote_address;
socket = new DatagramSocket(LOCAL_PORT);
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
remote_port= packet.getPort();
remote_address= packet.getAddress();
//Si accede al contenuto di buf…
socket.close();
16
31
©M
. Bad
ella
G. M
alna
ti, 2
003-
04
Programmazione in Ambienti Distribuiti
Multicast
È possibile inviare pacchetti datagram a destinazioni multipleSI utilizza la class MulticastSocket, sottoclasse di DatagramSocketL’indirizzo del destinatario, specificato nel pacchetto deve essere un indirizzo di gruppo
Nel caso UDP/IP, il destinatario avrà un indirizzo compreso tra 224.0.0.0 - 239.255.255.255Occorre registrarsi come membri dell’indirizzo di gruppo tramite il metodo joinGroup(InetAddress)Occorre anche indicare il raggio (in numero di router attraversati) del gruppo tramite setTimeToLive(int)