Want to create interactive content? It’s easy in Genially!

Get started free

Modulo Training Code

Francesca Gioffredi

Created on November 26, 2024

Start designing with a free template

Discover more than 1500 professional designs like these:

Transcript

<Introduzione ai Socket>

DEFINIZIONE Un socket è un punto di accesso virtuale per la comunicazione tra due applicazioni, agendo come un ponte tra client e server.

TIPOLOGIE Esistono due tipi di socket: stream (basato sul protocollo TPC) e datagram (basato sul protocollo UDP). I socket stream forniscono una comunicazione affidabile e ordinata, mentre i socket datagram offrono una comunicazione meno affidabile ma più veloce.

ARCHITETTURA Un'applicazione client si collega a un server attraverso un socket. Il server ascolta su un indirizzo IP e una porta specifica, pronto a ricevere richieste dal client.

>

>

START >

<Socket>

I socket sono il fulcro della comunicazione tra programmi su diversi computer o dispositivi. Essi permettono lo scambio di dati attraverso una rete, creando un canale di comunicazione bidirezionale. Questa presentazione esplora il mondo dei socket in Java, analizzando la loro implementazione e le loro applicazioni pratiche.

Socket TPC

02

Protocollo UDP

04

03

01

00

Classi e Metodi

Programmazione di Rete

Introduzione

>

>

start >

<01>pROGRAMMAZIONE DI RETE

Le due parti: CLIENT e SERVER

Programma CLIENT

Apertura della connessione

Invio e Recezione dei Dati

Chiusura della connessione

>

>

Il lato Server si occupa di ascoltare richieste su una porta specifica di un indirizzo IP; attende connessioni da parte di uno o più client; una volta accettata una connessione, avvia la comunicazione bidirezionale; e infine, usa un ServerSocket per l'ascolto e un Socket per comunicare con il client.

Programma Server

Invio e Recezione dei Dati

Creazione del ServerSocket

Ascolto della richiesta di connessione

Chiusura della connessione

>

>

Socket TPC

02

Section 04

Protocollo UDP

04

03

01

00

Classi e Metodi

Programmazione di Rete

Introduzione

>

>

<02> socket tcp

Applicazione Client/Server

START >

L'obiettivo principale dell'applicazione descritta è stabilire una comunicazione tra due programmi, un ClientClock e un ServerClock, utilizzando il protocollo TCP. Quando il client si connette al server, quest'ultimo invia al client la data e l'ora correnti prelevate dal sistema del server. La struttura di questa applicazione, seppur semplice, rappresenta un tipico esempio di architettura client/server.

- Socket tcp

>

>

>

Il server svolge il ruolo di punto di ascolto per le richieste dei client, gestendo la comunicazione tramite socket TCP. I passaggi principali sono:

<Funzionamento lato Server >

Creazione di un ServerSocket: Il server avvia un oggetto ServerSocket su una porta specifica, che fungerà da punto di ascolto.

Ciclo infinito di ascolto: Il server rimane costantemente in attesa di richieste utilizzando il metodo accept() della classe ServerSocket. Questo metodo genera un oggetto Socket che rappresenta il canale di comunicazione con il client.

Invio dei dati: Una volta stabilita la connessione, il server invia la data e l'ora correnti al client. I dati vengono scritti sul socket tramite un flusso di output incapsulato in un oggetto PrintWriter.

Chiusura della connessione: Dopo aver inviato i dati, il socket viene chiuso, ma il server torna immediatamente in ascolto per nuove richieste.

<Funzionamento lato Client>

// Connessione al server:

Il client crea un oggetto Socket, specificando l'indirizzo IP del server e la porta. Questo rappresenta la richiesta di connessione.

// Lettura dei dati:

Dopo aver stabilito la connessione, il client legge i dati (data e ora) inviati dal server utilizzando un flusso di input, incapsulato in un BufferedReader.

// Chiusura della connessione:

Una volta ricevuti i dati, il client chiude il socket e termina il processo.

>

>

<Codice Java>

Il codice Java dell'applicazione include:

Importazione dei package: Include librerie necessarie come java.net per la gestione delle connessioni di rete e java.io per le operazioni di input/output.

ServerClock: La classe server utilizza un ServerSocket per ascoltare le richieste e inviare i dati. Dopo aver acquisito la data e l'ora dal sistema tramite un oggetto Date, trasforma queste informazioni in una stringa e le invia al client.

ClientClock: La classe client si connette al server utilizzando un Socket, legge i dati inviati e li visualizza sul terminale. Entrambi i programmi utilizzano il costrutto try-catch per gestire eventuali eccezioni, come errori di connessione o problemi con i flussi di input/output.

>

>

Mentre ServerSocket è utilizzato solo dal server per ascoltare richieste, Socket è il canale bidirezionale effettivo per lo scambio di dati.

Il server rimane attivo in attesa di nuove richieste finché non viene manualmente interrotto o il sistema viene spento.

Porta di comunicazione:

>

>

Socket e ServerSocket

Ciclo infinito del server

Il numero di porta utilizzato deve essere concordato tra client e server, e non deve essere inferiore a 1000 né superiore a 65535.

Socket TPC

02

Protocollo UDP

Section 04

04

03

01

00

Classi e Metodi

Programmazione di Rete

Introduzione

>

>

<03> SockEt

CLASSI E METODI

START >

PACKAGE JAVA.NET

Il linguaggio di programmazione JAVA dispone del package java.net per la gestione della comunicazione di rete. Viene fornito un elenco delle funzionalità principali di alcune delle classi fondamentali del package

>

>

protocollo tpc: classi socket e serversocket

In Java, il protocollo TCP (Transmission Control Protocol) viene implementato tramite le classi Socket e ServerSocket della libreria java.net. TCP è un protocollo orientato alla connessione che garantisce il trasferimento affidabile e ordinato dei dati tra due endpoint di rete.

>

Classe Socket

>

Classe ServerSocket

Socket TPC

02

Section 04

Protocollo UDP

04

03

01

00

Classi e Metodi

Programmazione di Rete

Introduzione

>

>

<04> Protocollo UDP

START >

>

<Caratteristiche>

Non è orientato alla connessione (connectionless).

Comunicazione senza handshaking, quindi più rapido ma meno affidabile.

Non garantisce la consegna dei dati né preserva l'ordine dei pacchetti.

Utile per applicazioni che richiedono velocità e tollerano perdita di dati.

Classi principali in Java per UDP

1. DatagramPacket: rappresenta un datagram (unità di dati). • Utilizzato per inviare o ricevere dati tramite UDP. • Diversi costruttori disponibili per personalizzare buffer, indirizzi e porte.

2. DatagramSocket: usato per creare socket UDP. Metodi principali: • send(DatagramPacket p): invia un pacchetto. • receive(DatagramPacket p): riceve un pacchetto. • setSoTimeout(int timeout): imposta un timeout. • close(): chiude il socket.

>

>

Programma Client-Server UDP

Client: 1. Crea il socket. 2. Invia una richiesta (indirizzo, porta, messaggio). 3. Riceve una risposta. 4. Chiude il socket. Server: 1. Crea il socket. 2. Aspetta richieste, le riceve e invia risposte. 3. Chiude il socket.

>

>

Confronto TCP vs UDP

TCP: affidabile, garantisce consegna e ordine, ma più lento.

Confronto TCP vs UDP

UDP: rapido, non garantisce affidabilità né ordine, utile per comunicazioni "timely" più che "orderly and reliable."

>

>

Ramundo, Gioffredi, Mattanò, Domenichiello

Unità completata

Classe ServerSocket

La classe java ServerSocket permette di creare un socket che realizza un server TCP. I metodi maggiormente utilizzati sono i seguenti:

ServerSocket e Socket

Il ServerSocket viene usato soltanto lato server perché si tratta di un Socket particolare, esso infatti non viene utilizzato per comunicare dati quindi per inviare o ricevere dati ma soltanto per ricevere richieste di connessione. Ricevuta la richiesta di connessione, si creerà un altro socket che sarà di tipo Socket() che sarà utilizzato per la comunicazione. SeverSocket sSocket = new SeverSocket(porta) connessione = new Socket (server, porta)

La prima riga di codice acquisisce lo stream di output e lo assegna alla variabile out che è di tipo OutputStream. La seconda serve per incapsulare il flusso di output nel PrinterWriter (scrittore di caratteri). Questo perché si vuole avere un output in forma di caratteri, ossia si vogliono inviare stringhe al server.

InputStream in = connessione.getInputStream(); InputStreamReader input = new InputStreamReader(in); BufferedReader sIN = new BufferedReader(input); InputStream in = connessione.getInputStream();

&

Recezione

Viene acquisito il flusso di input associato al Socket e viene asseganto alla variabile in che è di tipo InputStream che legge uno ad uno i byte dello stream della tastiera. Trasforma la sequenza di byte in una sequenza di caratteri secondo il codice Unicode adottato da Java. l BufferedReader permette di leggere caratteri e stringhe in modo più efficiente.

Invio

OutputStream out = connessione.getOutputStream(); PrinterWriter sOUT = new PrinterWriter(out);

SeverSocket sSocket = new SeverSocket(porta); while (true) { Socket connessione = new sSocket.accept // […] codice per inviare e ricevere dati tramite la connessione connessione.close(); }

Una volta che arriva la richiesta di connessione, viene creato dal server l’oggetto Socket che è lo stesso oggetto che è stato creato lato client e su questo oggetto di tipo Socket vengono inviati e ricevuti i dati con i metodi già visti.

Invio e Recezione

Inizia così la fase di invio e ricezione dei dati con il client. Tale fase di invio/ricezione verrà fatta usando il Socket che si chiama connessione e non utilizzando il serverSocket (Socket). Una volta terminata la fase di invio e ricezione dati che può avere una durata anche lunga ossia ci può essere più volte l’operazione di invia e ricevi stringhe per esempio.

(All'interno del ciclo while)

Per chiudere la connessione si usa il metodo Close della classe Socket quindi:

Chiusura della connessione

  • connessione.close();
Classe Socket

La classe Socket dispone del metodo connect che realizza un client TCP effettuando una richiesta di connessione a un server TCP.

La connessione un oggetto di tipo Socket => viene chiuso il Socket().

Per chiudere la connessione si usa il metodo Close della classe Socket quindi:

Chiusura della connessione

  • connessione.close();

Apertura della connessione

Il client invia una richiesta al server attraverso il Socket. Si crea una istanza dell’oggetto Socket che fa parte del package java.net. connessione = new Socket (server (String), porta (int));

  • Sulla porta indicata, viene creata una connessione con il server. La variabile connessione è una variabile di tipo Socket.

InputStream in = connessione.getInputStream(); InputStreamReader input = new InputStreamReader(in); BufferedReader sIN = new BufferedReader(input); InputStream in = connessione.getInputStream();

La seconda serve per incapsulare il flusso di output nel PrinterWriter (scrittore di caratteri). Questo perché si vuole avere un output in forma di caratteri, ossia si vogliono inviare stringhe al server.

La prima riga di codice acquisisce lo stream di output e lo assegna alla variabile out che è di tipo OutputStream.

&

Recezione

Viene acquisito il flusso di input associato al Socket e viene asseganto alla variabile in che è di di tipo InputStream che legge uno ad uno i byte dello stream della tastiera. Trasforma la sequenza di byte in una sequenza di caratteri secondo il codice Unicode adottato da Java. l BufferedReader permette di leggere caratteri e stringhe in modo più efficiente.

Invio

OutputStream out = connessione.getOutputStream(); PrinterWriter sOUT = new PrinterWriter(out);