Esercitazioni per il laboratorio di Sistemi di elaborazione e trasmissione dell'informazione
Comunicazione tramite Socket.


Due computer collegati tramite una rete locale possono comunicare tra loro nella modalità Client/Server o nella modalità peer to peer.

I computer sono dotati di una scheda di rete che si collega alla LAN. I programmi per affidare alla scheda di rete i messaggi da trasferire alla rete, preparano una richiesta e la inviano al socket.

Un socket rappresenta un connettore software che si immagina si innesti sulla scheda di rete.

Il programma Server riceve i messaggi, li esamina e prepara una risposta.

Affinchè i due sistemi, mittente e destinatario, possano comunicare appoggiandosi sul protocollo TCP devono stabilire una connessione:
  1. Il client invia un pacchetto di tipo Request con la richiesta di apertura connessione (CALL_REQUEST)
  2. la rete smista il pacchetto e lo consegna al destinatario (CALL_INDICATION)
  3. il server, se è disponibile, invia un pacchetto di tipo Response per accettare la connessione
  4. il pacchetto viaggia attraverso la rete locale e viene consegnato al mittente (CALL_ACCEPTED)
A questo punto la connessione è stata stabilita e i pacchetti contenenti i dati da trasferire tra i due interlocutori transiteranno sulla connessione.

La connessione su cui viaggiano i pacchetti è rappresentata dai dispositivi di rete che partecipano allo smistamento dei pacchetti (router), ma le apparecchiature di rete gestiscono più comunicazioni sugli stessi canali fisici assegnando a ciascuna un numero di identificazione (canale logico).

Architettura di un programma di comunicazione: il programma Client.
Il programma Client crea un socket e gli assegna un numero di porta. Questo numero rappresenta un identificativo del programma con cui il socket entra in comunicazione. Cioè sulla stessa scheda di rete si possono creare più socket, ognuno in comunicazione con un programma.

L'associazione tra il programma e il socket è il numero di porta.

Programma Client

Le classi che consentono di aggiungere ai programmi le funzionalità di comunicazione sulla rete sono disponibili nella libreria java.net (linea 2).
Nella linea 3 viene dichiarata la classe Client e nella linea 4 si inizia la dichiarazione del metodo main

Nelle linee da 5 a 10 si dichiarano degli oggetti locali al metodo main, tutti non inizializzati.


Commenti al blocco try ... catch:
L’organizzazione generale di un programma client è composta dalle seguenti parti:
  1. Apertura di un socket. (linea 12)
    Con l'operatore new si crea un oggetto Socket e lo si può riferire con il nome Connettore.
    Il costruttore dell’oggetto socket richiede, per parametri, il nome del computer a cui ci si connette e il numero della porta su cui è in ascolto il programma server.
    Il termine Socket è traducibile come connettore, cioè un punto in cui si innesta uno spinotto. Quindi si può pensare al socket come se fosse un connettore a cui, da un lato, giungono i cavi di trasmissione e ricezione della rete locale e, dall’altro lato, il programma invia e riceve i pacchetti.
  2. Apertura di un flusso di input e di uno di output verso il socket.
    Le istruzioni alle linee 13 e 14 ottengono il flusso di caratteri in uscita verso il socket.
    Analogamente, le istruzioni 15-17 ottengono il flusso di input del socket da un BufferedReader.
    Queste operazioni sono racchiuse in un blocco try ... catch perchè si deve considerare che un'operazione di input/output potrebbe trovare il dispositivo in uno stato "non pronto" e quindi si deve prevedere un meccanismo di risoluzione dell'errore.


  1. Lettura e scrittura in accordo al protocollo adottato dal server.
    Per inviare dati al server, attraverso il socket, il programma Client deve scrivere in PrintWriter (linea 29).
    Per ottenere la risposta dal server, il programma Client legge da BufferedReader (linee 26-28).
    Nel ciclo while si legge una linea alla volta dal flusso di caratteri proveniente dalla tastiera e la si manda al server scrivendola nel PrintWriter connesso al socket.

    L’ultima istruzione nel ciclo while legge una linea dal BufferedReader connesso al socket, Il messaggio di risposta dal server in questo esempio è la ripetizione del messaggio inviato. Il metodo readLine (linea 28) ferma il programma Client in attesa che ci sia un messaggio da leggere dalla tastiera.


  1. Chiudere il flusso. Chiudere il socket.
    Il ciclo while si interrompe quando l’utente digita un carattere di fine input, corrispondente a ctrl+C sulla tastiera.
    Un programma, quando termina, deve eliminare le tracce del suo passaggio, per non lasciare residui di memoria occupati e non più recuperabili.
    Le istruzioni 32-39 chiudono i reader ed i writer connessi al socket ed ai dispositivi di I/O, e chiudono le connessioni al server.
    Prima si devono chiudere i flussi connessi al socket e poi il socket stesso.

Architettura di un programma di comunicazione: il programma Server.
L'organizzazione del programma Server è simile a quella già esaminata del programma Client.

(linea 3) La classe che realizza il programma Server ha il nome Pappagallo, perchè, in questo esempio, si limita a ripetere al client il messaggio ricevuto.
(linea 5) La classe ServerSocket fornisce il gestore dell'evento richiesta apertura connessione.
(Linea 6) Si nota che si crea anche un oggetto di classe Socket. In pratica l'oggetto ServerSocket ha lo scopo di restare in ascolto di richieste di connessione e l'oggetto di classe Socket ha lo scopo di inviare e ricevere pacchetti sulla connessione con il client.



(linea 13) Se la porta è libera il socket viene creato, altrimenti si verifica un errore.
(linea 20) Il metodo accept mette il server in attesa che un client richieda l'apertura di una connessione su questo computer e su questo numero di porta.
Quando si stabilisce la connessione il metodo accept restituisce un oggetto Socket che si trova sulla stessa porta locale e si collega, all'altro estremo della connessione, alla porta del client remoto.
Il server può comunicare con il client tramite questo socket e continuare ad ascoltare le richieste di connessione del client sul ServerSocket.