Modello client-server Client multipli

Transcript

Modello client-server Client multipli
25/09/2015
Modello client-server
 Il server fornisce servizi sulla rete
 Viene eseguita l’applicazione server su un host
 L’applicazione attende connessioni dalla rete
 Il client usufruisce del servizio attraverso la rete
 Deve conoscere l’indirizzo del server (host+porta)
 Deve effettuare la richiesta di connessione
 Scambia dati con il server
 Sia il client che il server sono programmi applicativi che utilizzano i
servizi di rete
 Talvolta i termini client e server si usano per riferirsi all’host su cui
viene eseguito l’applicativo
1
Client multipli
client
porta
effimera
server
client
porta
nota
client
 I client aprono connessioni col server (apertura attiva)
 Il server apre una connessione su richiesta di un client (apertura
passiva)
 Un server sequenziale serve le richieste una dopo l’altra (coda delle
richieste)
 Un server parallelo divide il tempo fra le varie richieste (multithread)
2
1
25/09/2015
netstat –p –n –-inet -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address
Foreign Address
State
tcp
0
10.0.0.1:1855
ESTABLISHED 16907/in.telnetd: f
tcp
0
0 10.6.1.9:3219
10.0.0.1:22
ESTABLISHED 5134/ssh
tcp
0
0 0.0.0.0:6000
0.0.0.0:*
LISTEN
645/X
tcp
0
0 0.0.0.0:3047
0.0.0.0:*
LISTEN
635/kdm
tcp
0
0 0.0.0.0:139
0.0.0.0:*
LISTEN
587/smbd
tcp
0
0 0.0.0.0:22
0.0.0.0:*
LISTEN
550/sshd2
tcp
0
0 0.0.0.0:25
0.0.0.0:*
LISTEN
510/master
tcp
0
0 0.0.0.0:23
0.0.0.0:*
LISTEN
408/inetd
tcp
0
0 0.0.0.0:21
0.0.0.0:*
LISTEN
408/inetd
tcp
0
0 0.0.0.0:111
0.0.0.0:*
LISTEN
349/portmap
udp
0
0 0.0.0.0:177
0.0.0.0:*
udp
0
0 0.0.0.0:111
0.0.0.0:*
raw
0
0 0.0.0.0:1
0.0.0.0:*
7
-
raw
0
0 0.0.0.0:6
0.0.0.0:*
7
-
283 10.6.1.9:23
PID/Program name
635/kdm
349/portmap
coda di trasmissione
(byte senza ack)
coda di ricezione
(byte in coda)
3
Server sequenziale senza connessione
(schema in C)
client
sd=socket(..)
server
sd=socket(..)
d
k ( )
bind(sd,..)
ripeti
ripeti
crea dati
richieste
sendto(sd,..)
recvfrom(sd,..)
elabora dati
le richieste sono
accodate e servite
in sequenza
recvfrom(sd,..)
elabora dati
sendto(sd,..)
risposte
close(sd)
4
2
25/09/2015
Server sequenziale connesso
(schema in C)
client
sd=socket(..)
d
k ( )
sd=socket(..)
bind(sd,..)
listen(sd,..)
server
ripeti
connect(sd,..)
sc=accept(sd,..)
ripeti
write(sd,..)
ripeti
richieste
read(sc,..)
read(sd,..)
elabora dati
risposte
elabora dati
write(sc,..)
close(sd)
close(sc)
Server parallelo connesso
(schema in C)
sd=socket(..)
client
sd=socket(..)
d
k ( )
bind(sd,..)
connect(sd,..)
server child
ripeti
ripeti
write(sd,..)
read(sd,..)
listen(sd,..)
richieste
read(sc,..)
ripeti
sc=accept(sd,..)
elabora dati
risposte
fork(..)
elabora dati
write(sc,..)
close(sd)
close(sc)
server parent
6
3
25/09/2015
java.net
 E’ il package Java che mette a disposizione una serie di classi che
supportano la programmazione di rete utilizzando i protocolli
Internet (IP,TCP,UDP)
 InetAddress
Classe che incapsula gli indirizzi IP e supporta la conversione fra indirizzi
numerici e nomi simbolici (DNS)
 Socket
Classe che implementa la socket client
 SocketServer
Classe che implementa la socket server (processo che attende connessioni
su una porta)
7
InetAdress
 La classe mette a disposizione metodi che supportano le operazioni
comuni sugli indirizzi Internet
 static InetAddress getLocalHost
getLocalHost()
()
produce un oggetto InetAddress che rappresenta l’indirizzo dell’host locale
su cui è eseguito il programma
 static InetAddress getByName
getByName((String host)
host)
produce un oggetto InetAddress che per un host specifico. Il nome dell’host
può essere espresso o con l’indirizzo IP (es. 193.205.7.2) o con il nome della
macchina (es. web.dii.unina2.it)
 String getHostName
getHostName()
()
produce il nome dell’host
 String getHostAddress
getHostAddress()
() - byte[] getAddress()
getAddress()
producono l’indirizzo IP (come stringa o array di 4 byte)
8
4
25/09/2015
Socket
 Implementa i socket per connessione client
 I metodi principali sono
 Socket(InetAddress a, int port)
costruttore di un oggetto socket connesso con l’host di indirizzo a sulla porta
port. Può generare un’eccezione se non si riesce ad aprire la connessione
 InputStream getInputStream()
produce il canale di lettura dal socket (si gestisce come un file)
 OutputStream getOutputStream()
produce il canale di scrittura sul socket (si gestisce come un file)
 void close()
chiude il socket
9
ServerSocket
 Implementa il server TCP:
TCP il server rimane in ascolto su una porta
specificata nel costruttore fino a quando non c’è una richiesta di
connessione da parte di un client
 Le richieste vengono accodate
 ServerSocket(int port)
costruttore di un oggetto server in ascolto sulla porta specificata
 Socket accept()
metodo bloccante fino a che non si verifica una richiesta di connessione.
connessione
Viene prodotto l’oggetto socket che rappresenta la connessione
10
5
25/09/2015
java.net per UDP
 DatagramSocket: Classe che implementa socket client e server utilizzando UDP
 Costruttore senza argomenti per il client
client, con il numero di porta per il server
 metodi send(DatagramPacket p) e receive(DatagramPacket p)
 definizione di un timeout SO_TIMEOUT per il receive con setSoTimeout (int
timeout)
 DatagramPacket: Classe per rappresentare un datagram per invio o ricezione
 DatagramPacket(byte[] buffer,int length ,InetAddress,int port) costruisce
un datagram per spedizione. L’indirizzo rappresenta l’IP del destinatario, l’ultimo
parametro il numero di porta
p
p
 void setData(byte[] buffer) inserisce dati nel pacchetto da inviare
 DatagramPacket(byte[] buffer,int lenght ) costruisce un datagram per
ricezione. L’array di byte è il buffer usato per memorizzare il datagram, l’intero è la
lunghezza
 InetAddress getAddress() e int getPort() sono usati per ottenere IP e porta del
mittente del datagram
 byte[] getData() ottiene i dati del pacchetto
11
6