Socket in Java - Politecnico di Torinocorsiadistanza.polito.it/corsi/pdf/07EKEDC/Socket.pdf · Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Connesso (stream-oriented)Basato sulla metafora del “tubo”Permette lo scambio di informazioni tra due partnerGarantisce la consegna ordinata ed affidabile di tutti i dati scambiatiRichiede ai sistemi operativi dei partner un certo impegno di risorse
Non connesso (datagram-oriented)Basati sulla metafora della “lettera”Possono consentire la comunicazione tra più partner (uno a uno o uno a molti)Non garantiscono nulla sulla consegnaRichiede ai sistemi operativi dei partner risorse limitate
La comunicazione richiede tre fasi:1. Richiesta di connessione
Mittente e del destinatario allocano risorse per gestire il flusso di dati
2. Trasferimento di datiMittente e destinatario possono scambiarsi dati di dimensione arbitraria: il sistema operativo provvede a frammentare le informazioni in pacchetti, in modo trasparenteIn caso di ricezioni di pacchetti errati o di mancata consegna, viene gestita automaticamente la ritrasmissione
3. Rilascio della connessioneLe risorse vengono rilasciate
Ogni architettura di rete definisce, a livello 4 (trasporto) del modello ISO/OSI, opportuni protocolli che permetto l’instaurarsi di comunicazioni secondo i due diversi modelliNel caso delle reti IP:
TCP (Transport Control Protocol) fornisce servizi orientati alla connessioneUDP (User Datagram Protocol) fornisce servizi di trasporto non connessi
Astrazione delle terminazioni di una connessione di rete“A socket is defined to bethe unique identification to or from which information is transmittedin the network” (RFC 147 – 7 maggio 1971)Concetto nato in ambiente Unix per reti di tipo IP ed esteso a contesti differenti
VantaggiModello consolidatoIndipendente dalla piattaformaMassima flessibilità
SvantaggiMinimo livello di astrazione possibileTutte le funzionalità avanzate (sicurezza, bilanciamento del carico, individuazione dei possibili interlocutori, …) sono a carico del programmatore
Un’unica interfaccia (struttura dati, funzioni) per una pluralità di comportamenti
“Raw socket” per connettersi direttamente al protocollo di rete“Stream socket” per modellare sia il ruolo di client che quello di server nei protocolli connessi“Datagram socket” per modellare comunicazioni orientate ai messaggi
Macchina a stati complessa per definire lo stato di ciascun socket
Un’insieme di classi specializzate in compiti distintiDefiniti nel package java.net
Rispetto al modello originale UNIX, molte semplificazioni ed alcuni limiti
Approccio ad oggettiClassi diverse modellano comportamenti diversiMacchina a stati semplificataNon è possibile accedere direttamente al protocollo di rete (non esistono socket di tipo “raw”)
I flussi di ingresso e uscita dei socket permettono lo scambio di dati con il partner remoto
Le comunicazioni sui due canali sono del tutto indipendenti e possono avvenire in qualsiasi ordine (canale di comunicazione full duplex)Per facilitare l’implementazione dei servizi, client e server si accordano (preventivamente) su un protocollo applicativo che definisce le regole che governano tale comunicazione:
o Si può parlare contemporaneamente? o Chi parla per primo? o Cosa è lecito dirsi?o …
Si opera sui flussi tramite i metodi elementari di InputStream e OutputStream o i loro derivati
int read()void write(int b)
Tali metodi sono bloccanti:Quando vengono invocati non ritornano fino a che l’operazione richiesta non è terminata (o abortita esplicitamente da una terza parte)
Per semplificare lo scambio di dati, spesso si utilizzano classi “filtro” specializzate nell’aggiungere funzionalità ulteriori
Reader/Writer: utilizzo di caratteri Unicode invece che byte come dati elementariBufferedInputSrteam/BufferedOutputStream: inserimento di un buffer per migliorare le prestazioniDataInputStream/DataOutputStream: metodi per la (de)codifica di dati più complessi…
Il metodo handleRequest(…) implementa il protocollo di comunicazione con il client
All’interno di questo metodo si elaboreranno i dati provenienti dal client e si gestirà opportunamente l’interazioneAl termine dell’interazione, il metodo ritorna e diventa possibile accettare una nuova richiesta da parte di un client differente
Cosa succede se, a causa di un malfunzionamento o di un errore di programmazione, il server non riesce a leggere un messaggio atteso da un client?E cosa capita se due client cercano di connettersi contemporaneamente al server?
Ogni socket connesso è legato ad una portaAltrimenti i protocolli di rete non potrebbero recapitare i datiad esso destinati
Nel caso dei client, la porta spesso è irrilevanteAll’atto della costruzione, viene scelta la prima disponibileIl metodo int getLocalPort() permette di conoscerla
Ogni calcolatore può avere più di una scheda di reteNormalmente vengono creati socket che dialogano con la scheda “primaria”Nel costruttore è possibile specificare l’indirizzo della scheda da utilizzare e la relativa porta
È possibile inviare pacchetti datagram a destinazioni multipleSI utilizza la class MulticastSocket, sottoclasse di DatagramSocketL’indirizzo del destinatario, specificato nel pacchetto deve essere un indirizzo di gruppo
Nel caso UDP/IP, il destinatario avrà un indirizzo compreso tra 224.0.0.0 - 239.255.255.255Occorre registrarsi come membri dell’indirizzo di gruppo tramite il metodo joinGroup(InetAddress)Occorre anche indicare il raggio (in numero di router attraversati) del gruppo tramite setTimeToLive(int)