Want to create interactive content? It’s easy in Genially!
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);