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.
Per comunicare su rete tra applicazioni distribuite, JAVA mette a disposizione le seguenti classi:
InetAddress
, per la virtualizzazione dell’indirizzo IP di un host nella rete;URL
con tutti i suoi metodi, per la gestione di una connessione con una url che abilita al prelievo dati;Socket
, per le connessioni socket standard lato client;ServerSocket
per le connessioni socket standard lato server.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).
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.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 di un documento di testo proveniente dal Web
Passi generali
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.
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");
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)
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");
La classe ServerSocket:
Ha due costruttori:
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.
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.
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
.
Nel package java.net sono fornite delle classi per la comunicazione basata su UDP.
Le classi principali sono:
La struttura dati incapsulata in un’istanza di DatagramPacket consiste di due parti:
Fornisce due costruttori:
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:
Ricezione di un datagramma Mostra codice
Invio di un datagramma Mostra codice
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 codice2. La modellazione a oggetti e il linguaggio UML (richiami)
3. Generalità su Java e la programmazione ad oggetti
6. Regole di traduzione da UML a Java/C++
7. Programmazione multi-thread
8. Sincronizzazione tra thread
9. Programmazione client-server con socket TCP/IP (Java networkin...
10. Programmazione di applicazioni client-server: il Pattern Proxy...
12. Design Patterns
13. Pattern architetturali - Esempi
14. Design pattern creazionali. Esempi
15. Design pattern strutturali. Esempi
16. Introduzione alle tecnologie middleware
17. Modelli di middleware: RPC, MOM, TP, TS
Bruce Eckel, “Thinking in Java”