Socket, DatagramSocket & DatagramPacket. - Gaia-Barberio-Peano-5Ci/ChatClientServer GitHub Wiki
SOCKET
Un socket è un oggetto software che permette l'invio e la ricezione di dati, tra host remoti (tramite una rete) o tra processi locali (Inter-Process Communication). Più precisamente, il concetto di socket si basa sul modello Input/Output su file di Unix, quindi sulle operazioni di open, read, write e close; l'utilizzo, infatti, avviene secondo le stesse modalità, aggiungendo i parametri utili alla comunicazione, quali indirizzi, numeri di porta e protocolli.
Socket locali e remoti in comunicazione formano una coppia (pair), composta da indirizzo e porta di client e server; tra di loro c'è una connessione logica. Solitamente i sistemi operativi forniscono delle API per permettere alle applicazioni di controllare e utilizzare i socket di rete. Inoltre,la funzione dei socket è quella di indirizzamento dei processi.
FORMATO DI UN SOCKET ADDRESS
Dato che sui sistemi interlocutori possono esserci molti processi, bisogna avere un modo per indirizzare precisamente il processo con cui si sta dialogando. Per questo si usano le porte: dei numeri che identificano i processi in esecuzione.
Gli interlocutori, quindi, memorizzano indirizzo e porta della controparte, in un indirizzo socket, formato così:
- Indirizzo IP: 32 bit;
- Numero di porta: 16 bit.
I numeri di porta sono stati definiti dalla IANA (Internet Assigned Numbers Authority), e si dividono in:
- Well-known (riservate a protocolli specifici): 20, 23, 25, 80, 110,…
- Non usate: 0
- Riservate per processi well-known: 1-255
- Riservate per altri processi: 256-1023
- Altre applicazioni: 1024-65535
Normalmente i numeri di porta assegnati ai processi (non well-known) sono a discrezione del sistema operativo. Si dice che il sistema operativo assegna delle porte effimere.
DATAGRAMSOCKET
Sono basati su UDP, un protocollo a livello di trasporto che garantisce comunicazioni a bassa latenza (ideali per videochat, ad esempio), a discapito dell'affidabilità dei dati. Non esiste, infatti, controllo di flusso (ordinamento dei datagrammi e controllo degli errori).
Dato che l'UDP non è un protocollo orientato alla connessione, non esiste la fase di connessione, ma il client comunica direttamente con il server, quando vuole.
1 – Creazione dei socket
Client e server creano i loro rispettivi socket, e il server lo pone in ascolto su una porta. Il socket del server non ha bisogno di una coda, in quanto i dati in entrata e in uscita non devono essere circoscritti all'interno di una connessione, quindi la comunicazione con diversi client si svolte sulla stessa interfaccia.
2 – Invio dei dati
Il client invia direttamente i datagrammi al server.
3 – Risposta del server
Il server manda al client un eventuale risposta. La comunicazione è quindi, costituita da un loop che dura finchè ci sono dati da inviare e, ovviamente, finchè gli host sono raggiungibili.
DATAGRAMPACKET
Un DatagramPacket è un messaggio che può essere inviato o ricevuto. Se invii più pacchetti, potrebbe arrivare in qualsiasi ordine. Inoltre, la consegna dei pacchetti non è garantita.
Costruttori comunemente usati della classe DatagramPacket:
- DatagramPacket (byte [] barr, int length): crea un pacchetto di datagrammi. Questo costruttore viene utilizzato per ricevere i pacchetti.
- DatagramPacket (byte [] barr, int length, InetAddress address, int port): crea un pacchetto di datagrammi. Questo costruttore viene utilizzato per inviare i pacchetti.