socket in java - politecnico di torinocorsiadistanza.polito.it/corsi/pdf/07ekedc/socket.pdf · il...

16
1 © M. Badella G. Malnati, 2003-04 Programmazione in Ambienti Distribuiti A.A. 2003-04 Socket in Java 2 © M. Badella G. Malnati, 2003-04 Programmazione in Ambienti Distribuiti Modelli di comunicazione Connesso (stream-oriented) Basato sulla metafora del “tubo” Permette lo scambio di informazioni tra due partner Garantisce la consegna ordinata ed affidabile di tutti i dati scambiati Richiede 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 consegna Richiede ai sistemi operativi dei partner risorse limitate

Upload: trinhquynh

Post on 10-Apr-2019

226 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 2: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 3: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 4: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 5: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 6: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 7: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 8: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 9: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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);

}

}

}

Page 10: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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)

Page 11: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 12: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 13: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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…

Page 14: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 15: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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

Page 16: Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client

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)