Esercitazioni per il laboratorio di Sistemi di elaborazione e trasmissione dell'informazione
Comunicazione con datagram Socket.
L’esempio seguente consiste di due programmi. Uno svolge il ruolo di Server e l’altro quello di Client.

Il programma Client può essere eseguito contemporaneamente da più elaboratori della rete.

Questi inviano pacchetti di tipo datagramma e il server li riceve su un socket. Si immagina che il client chieda al server di mandargli un proverbio, un consiglio, ecc.

Il server risponde, ad ogni datagramma ricevuto dal client, con la frase: “pensierino del giorno:”.

L’applicazione Client è molto semplice: consiste di una sola classe. Manda un pacchetto al server e aspetta che il server gli mandi una risposta.

L’applicazione Server è realizzata con due classi: PensieriSrv e PensieriSrvThread.

Preparare un file di testo: "Pensierini.txt" contenente su ogni riga proverbi, frasi famose, consigli, ecc.

L'applicazione Server
La classe PensieriSrv crea un oggetto Thread e lo avvia.


La classe PensieriSrvThread.
Quando viene creata, la classe PensieriSrvThread crea un processo in ascolto sulla porta 4445, tramite il quale il server comunica con i client.



Il costruttore apre un oggetto BufferedReader sul file Pensierini.txt che contiene un elenco di Pensieri, di proverbi o di consigli, uno per riga.

Il metodo run contiene un ciclo while che si interrompe solo quando non ci sono più linee da leggere dal file.

Ad ogni ciclo, il thread aspetta che giunga un DatagramPacket sul DatagramSocket. In risposta alla richiesta del client, PensieriSrvThread preleva una linea dal file, la inserisce in un DatagramPacket e la manda tramite il DatagramSocket al client che l’aveva richiesta.

La linea 23 crea un array di byte che serve a creare il DatagramPacket ricevuto dal socket.

L’istruzione 25 lascia il programma in attesa di ricevere un pacchetto.

A questo punto si supponga che il server abbia ricevuto una richiesta dal un client. La risposta viene formata nelle linee 26-36. Se il file non è aperto, il server invia la data del giorno. Altrimenti viene prelevato il prossimo messaggio dal file, convertito in array di byte e inviato al client, dopo che è stato estratto l’indirizzo e la porta dal pacchetto ricevuto.

Il costruttore del datagramma (linea 35) richiede 4 argomenti. Il primo è un array di byte contenente il messaggio spedito, il secondo parametro è la lunghezza dell’array, Il terzo argomento è l’indirizzo IP e il quarto argomento è il numero del port.

Il ciclo while termina quando sono stati letti tutti i messaggi dal file.












La classe PensieriCnt




L’applicazione Client invia una richiesta al programma PensieriSrv, aspetta la risposta e, quando la riceve, la mostra sullo schermo.

Il metodo main si aspetta di ricevere un parametro: il nome del computer su cui è in esecuzione l’applicazione server. Se non lo riceve segnala l'errore e indica qual è il modo per richiamare il programma.

Poi, il metodo main crea un DatagramSocket. Il costruttore del client non richiede di specificare un numero di porta, perchè ne sceglie uno non usato.

Il client invia un pacchetto al Server il cui indirizzo è stato specificato al momento della richiesta di esecuzione e la cui porta è 4445.

Il messaggio inviato dal client è vuoto. Il client resta in attesa della risposta. Normalmente dopo l’invio, la scehda di rete del computer client avvia un timer, per ripetere il pacchetto se nell’intervallo di attesa massimo previsto non arriva la risposta.
Bisogna eseguire prima il Server, poi lanciare l’applicazione Client specificando il nome del computer destinazione, sul quale è in esecuzione l’applicazione server.