Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
I corsi di Ingegneria
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Stefano Russo » 9.Programmazione client-server con socket TCP/IP (Java networking)


Sommario

  • Classi per la comunicazione su rete
    • InetAddress
    • URL
  • Socket TCP/IP
    • Classe Socket
    • Classe ServerSocket
  • Socket UDP/IP
    • Classe DatagramPacket
    • Classe DatagramSocket
  • Server Multithreaded

Gli Stream

Costituiscono il meccanismo fondamentale per l’astrazione della comunicazione in JAVA.

Uno stream rappresenta un canale monodirezionale tra due end-point.

Un dato inviato all’output stream può essere letto dall’input stream.


Supporto alla comunicazione su rete

Per comunicare su rete tra applicazioni distribuite, JAVA mette a disposizione le seguenti classi:

  • la classe InetAddress, per la virtualizzazione dell’indirizzo IP di un host nella rete;
  • la classe URL con tutti i suoi metodi, per la gestione di una connessione con una url che abilita al prelievo dati;
  • la classe Socket, per le connessioni socket standard lato client;
  • la classe ServerSocket per le connessioni socket standard lato server.

Classe InetAddress

Astrazione dell’indirizzo IP.

Java offre una classe per l’astrazione degli indirizzi.

Gli indirizzi numerici sono complessi da ricordare per gli esseri umani, pertanto si preferisce usare delle stringhe di caratteri:

www.grid.unina.it

Tali stringhe sono convertite nell’indirizzo IP associato per mezzo dell’interrogazione a un Domain Name System (spesso indicato con DNS).


Classe InetAddress

Alcuni metodi di utilità

  • InetAddress getLocalHost() throws UnknownHostException: restituisce l’indirizzo IP della macchina locale;
  • InetAddress getByName(String host) throws UnknownHostException: restituisce l’indirizzo IP associato a un dato host name;
  • Inetaddress[] getAllByName(String host) throws UnknownHostException: un array di indirizzi IP per un dato host name;
  • byte[] getAddress(): restituisce l’indirizzo, contenuto nell’oggetto, come seguenza di byte;
  • String getHostName(): restituisce il nome della macchina su cui sta girando il programma;
  • boolean isMulticastAddress(): restituisce verso sel’oggetto incapsula un indirizzo multicast.

Classe InetAddress

Le eccezioni

UnknownHostException: l’host non può essere correttamente identificato.

SecurityException: viene sollevato se il SecurityManager non permette l’esecuzione di una specifica operazione.

Esempio lettura documento su WEB

Esempio: lettura di un documento di testo proveniente dal Web

Passi generali

  • Creare un oggetto URL, rappresentante l’indirizzo della risorsa da leggere.
  • Creare un oggetto URLConnection, capace di stabilire una connessione con il sito corrispondente.
  • Utilizzando il servizio getInputStream(), di URLConnection, creare un InputStreamReader al fine di poter leggere dei caratteri dal flusso creato.
  • Creare BufferedReader per la lettura “bufferizzata” dal canale.

Esempio lettura documento su WEB

Mostra codice

Dove l'istruzione

page = new URL("http://www.grid.unina.it/index.html");

istanzia un oggetto URL, passando al costruttore l'url della pagina da leggere.

Esempio lettura documento su WEB

Mostra codice

Attraverso conn=urlw.page.openConnection(); ottengo la connessione al file indicato nel url.

Istanzio gli oggetti per l'operazione di IO:

in = new InputStreamReader(conn.getInputStream());
data=new BufferedReader(in);

Realizzo operazione di letture come con qualunque altro Reader:

while ((line=data.readLine())!=null) {
buf.append(line+"\n");

Socket TCP/IP

La classeSocket fornisce un’interfaccia socket per i client TCP.

Per aprire una connessione bisogna creare un’istanza di tale classe.

Socket conn= new Socket(nomeHost, numport)


Socket TCP/IP

Gli end-point streams si ottengono da un oggetto di tipo socket mediante i seguenti metodi:getInputStream(), getOutputStream()

InputStream in = conn.getInputStream();
OutputStream out= conn.getOutputStream();

… è possibile creare gli endpoint del canale mediante le classi Reader/Writer

writer = new OutputStreamWriter(out,"latin1");
reader = new InputStreamReader(in,"latin1");

Classe ServerSocket

La classe ServerSocket:

  • incapsula le strutture dati per la gestione delle connessioni TCP/IP server-side;
  • crea una socket per ogni connessione di un client. La socket creata potrà essere manipolata mediante gli streams ad essa associata.

Classe ServerSocket

Ha due costruttori:

  1. ServerSocket(int port) throws IOException;
  2. ServerSocket(int port, int backlog) throws IOException.

Il parametro port indica il “port number” sull’host locale (può assumenre valori 1-65535, anche se i valori da 1 a 1023 sono riservati).

Il parametro backlog indica il numero di massimo di richieste di connessione che possono essere accodate dal sistema operativo. Utilizzando il primo costruttore tale parametro assume il valore di default di 50.

Classe ServerSocket

Il metodo più importante è il seguente:

Socket accept() throws IOException

Comporta l’attesa (sul port number del server) di una richiesta di connessione (listening).

Alla ricezione di una connessione, l’oggetto ServerSocket crea una socket che rappresenta la connessione TCP con il client.

Il riferimento a tale socket verrà restituito al chiamante.

Esempio uso Socket


Esempio uso Socket


Esempio uso Socket


Esempio uso Socket


Esempio uso Socket


Confronto Socket Berkeley


Confronto Socket Berkeley


Confronto Socket Berkeley


Confronto Socket Berkeley


Aspetti avanzati

Personalizzazione dell’implementazione delle socket.

Creare una sottoclasse di SocketImpl introducendo le necessarie estensioni.

Creare SocketImplFactory che ritorna la nuova classe SocketImpl.

Registrazione della nuova classe Factory mediante la chiamata setSocketImplFactory.

Socket UDP/IP

Nel package java.net sono fornite delle classi per la comunicazione basata su UDP.
Le classi principali sono:

  • DatagramPacket: astrazione del pacchetto UDP (datagramma);
  • DatagramSocket: astrazione della socket UDP.

La struttura dati incapsulata in un’istanza di DatagramPacket consiste di due parti:

  • message body;
  • target address.

Fornisce due costruttori:

  • uno è utilizzato per inviare pacchetti e pertanto richiede anche l’indirizzo del destinatario;
  • l’altro richiede solamente il buffer per la memorizzazione del message body.

Socket UDP/IP

Gli oggetti di tipo DatagramSocket, per il lato server delle comunicazioni UDP fornisce due costruttori, dalla semantica analoga a quella TCP.

La trasmissione e ricezione avvengono mediante i seguenti metodi:

  • void send(DatagramPacket packet) throws IOException;
  • void receive(DatagramPacket packet) throws IOException.

Ricezione di un datagramma Mostra codice

Invio di un datagramma Mostra codice

Server Multithread

Permettono di migliorare l’efficienza creando uno o più thread per connessione.

Un Thread Worker che preveda un costruttore che accetti come parametro una socket.

Nel run() del worker è contenuto tutto il codice per il soddisfacimento della richiesta.

Mostra codice Mostra codice

I materiali di supporto della lezione

Bruce Eckel, “Thinking in Java”

  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion