TPSIT – Programmazione di rete – Applicazioni client/server

Hans Arp

La realizzazione di applicazioni client/server in Java si basa sulle classi contenute nel package java.net.

In quasi tutte le applicazioni di rete viene anche utilizzato il package java.io per gestire i flussi di comunicazione in input e output.

È quindi necessario importare i precedenti package in ogni programma in cui si vogliono eseguire operazioni con la rete.

import java.net.*;

import java.io.*;

I programmi client si differenziano dai programmi server per la loro struttura; la loro implementazione in Java è leggermente diversa. La comunicazione avviene tramite le entità chiamate socket (letteralmente, presa di corrente).
La socket è un punto da cui il programma può inviare i dati in rete e può ricevere i dati dalla rete.

Programma client

L’apertura di una connessione corrisponde a una richiesta inviata al programma server tramite la classe Socket.

connessione = new Socket(server, porta);

I due parametri da indicare al costruttore sono l’indirizzo del server, specificato come nome oppure come indirizzo IP del server, e la porta. Il risultato dell’apertura di una connessione è la creazione di una socket sul computer client che permette al programma di comunicare con la corrispondente socket presente sul computer server.

L’invio e la ricezione dei dati sono gestite in maniera simile alla scrittura e alla lettura dei file di dati, tramite uno stream. A ogni socket sono associati un flusso di input, da cui i programmi possono ricevere i dati, e un flusso di output, su cui i programmi possono inviare i dati in rete. Le seguenti istruzioni mostrano come viene impostato il flusso di input nel caso in cui la comunicazione avvenga con sequenze di caratteri:

InputStream in = connessione.getInputStream();

InputStreamReader input = new InputStreamReader(in);

BufferedReader sIN = new BufferedReader(input);

Il metodo getInputStream restituisce il flusso in input associato alla socket. Il programma utilizza il metodo readLine della classe BufferedReader per ricevere i dati.

Le seguenti istruzioni mostrano come viene impostato il flusso di output nel caso in cui la comunicazione avvenga con sequenze di caratteri:

OutputStream out = connessione.getOutputStream();

PrintWriter sOUT = new PrintWriter(out);

Il metodo getOutputStream restituisce il flusso in output associato alla socket.

Il programma utilizza il metodo println della classe PrintWriter per inviare i dati.

La chiusura della connessione viene eseguita quando si vuole interrompere la comunicazione di rete. Si deve richiamare il metodo close nel seguente modo:

connessione.close();

Programma server

I programmi server hanno la caratteristica di restare attivi in attesa di ricevere una richiesta di connessione da parte dei client. Questo comportamento viene realizzato con una socket particolare implementata con la classe ServerSocket.

La creazione di una socket di tipo server viene eseguita con la seguente istruzione:

ServerSocket sSocket = new ServerSocket(porta);

Il parametro indica la porta che viene riservata all’applicazione per ricevere le richieste dagli altri computer. Il numero di porta deve essere superiore a 1023.

Dopo aver creato la ServerSocket, il programma server si mette in attesa che un client si colleghi. Il metodo accept della classe ServerSocket è utilizzato per bloccare il programma server finché viene intercettata una richiesta di connessione. Quando giunge la richiesta, il metodo accept restituisce una socket che gestirà la connessione con il client.

Tramite questa nuova socket, il programma server potrà inviare e ricevere dati dal programma client.

La connessione viene chiusa con il metodo close. Il codice che riassume il comportamento del server è il seguente:

while (true) { Socket connessione = sSocket.accept();

// invio-ricezione dati tramite la connessione

connessione.close(); }

Tutte le operazioni eseguite con le socket possono generare delle eccezioni, principalmente eccezioni di tipo IOException. È quindi necessario racchiudere le istruzioni nei blocchi try…catch per evitare che il programma venga interrotto bruscamente.

Questa voce è stata pubblicata in Senza categoria. Contrassegna il permalink.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *