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