Introduzione ai socket
Con tale termine (che letteralmente vuol dire “presa”), in generale, si definisce una rappresentazione a livello software utilizzata per interfacciare i due terminali (endpoint) in gioco in una connessione tra due computer. In altre parole, potremmo considerare i socket come delle prese (una per ogni macchina) che siano interconnesse tra loro attraverso un ipotetico cavo in cui passi il flusso di dati che i computer si scambiano.
Un socket è oggetto software che permette l’invio e la ricezione di dati, tra host remoti (tramite una rete) o tra processi locali. 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.
Un socket è caratterizzato da:
- Un numero di porta identifica una specifica applicazione in esecuzione su una macchina
- Un socket rappresenta una estremità di una “comunicazione” di rete -> in una comunicazione di rete ci sono una coppia (pair) di socket.
- Un socket è formato dalla coppia: indirizzo IP, numero di Porta
Una connessione attraverso socket può essere locale (all'interno della stessa macchina) o remota (tra più macchine).
I protocolli coinvolti nell’implementazione dei Socket sono, fondamentalmente, 2:
- TCP (Transfer Control Protocol)
- UDP (User Datagram Protocol)
La principale differenza tra i socket TCP e UDP è che UDP è senza connessione e non si aspetta una conferma che l'altra estremità abbia ricevuto i dati (non fornisce garanzie di consegna), inoltre è l'unico protocollo che permette una comunicazione multicast. Mentre TCP è il contrario è connesso e si aspetta una conferma di aver ricevuto i dati.
Solitamente i sistemi operativi forniscono delle API per permettere alle applicazioni di controllare e utilizzare i socket di rete.
Porte
- Da 1 a 1023: porte ben note
- Da 1024 a 49151: porte registrate
- Da 49152 a 65535: porte private (assegnate dinamicamente dai processi)
Applicazioni Client/Server
Sono specifiche applicazioni che hanno una parte server ed un client che “colloquiano” e che per funzionare devono essere “compatibili”. Il processo server deve essere sempre utilizzabile dal client, quindi deve essere lanciato prima che venga usato dal client. Quando il client non richiede niente esso è in attesa, il client si connette e si disconnette.
Le socket API
https://drive.google.com/file/d/0BwH_P3Gjwc1AVkk2WjNSY2szQlk/view?usp=sharing
Comunicazione TCP e UDP in Java (con la libreria java.net)
Il package java.net mette a disposizione classi e interfacce per implementare applicazioni di rete, utilizzando il concetto di W.O.R.A. (write once, run anywhere)
TCP/UDP | |
---|---|
Indirizzo IP e Porta | classe InetAddress: rappresenta un indirizzo IP oppure un nome da risolvere con il DNS |
TCP | UDP | |
---|---|---|
Socket Client | classe Socket (con relative classi per gli stream) | classe DatagramSocket, classe DatagramPacket |
Socket Server | classe ServerSocket, Socket (con relative classi per gli stream) | classe DatagramSocket, classe DatagramPacket |
Piccola applicazione per lo scambio della data (un piccolo numero) in UDP
Server:
Il funzionamento di un server UDP è il seguente:
Crea un socket
Ripete:
Attende
Se (ha ricevuto un datagramma)
trasmette un datagram di risposta
Fino a interruzione esterna
Chiude il socket
Lo scambio di dati in formato binario tramite datagram UDP non è agevole.
Client:
Trasmette una richiesta e attende una risposta. Lo scambio di dati in formato binario tramite non è agevole, e quindi bisogna usare delle relative classi che agevolano il tutto. Il funzionamento può essere schematizzato in questo modo:
Crea un socket
Imposta il tempo di attesa massimo
Trasmette un datagram
Attende
Se !(timeout) riceve un datagram
Chiude il socket
Client (GUI):
Piccola applicazione per lo scambio della data (un piccolo messaggio testuale) in TCP
Server:
La classe ServerSocket si usa per creare un server che resta in ascolto di connessioni in entrata da uno o più clients.
- Al server è associata una porta specifica.
I server paralleli creano processi figli (o thread) incaricati di rispondere e tornano in ascolto di altre richieste.
Il funzionamento, a seconda se è interattivo o concorrente avviene così:
Server interattivo
Crea un ServerSocket
Imposta il tempo di attesa massimo
Ripete
Attende
Se (ha ricevuto un datagramma)
Crea un nuovo socket
Crea uno stream di input
Crea uno stream di output
Finché non ha finito
Trasmette e riceve
Chiude lo stream di output
Chiude lo stream di input
Chiude il socket
Fino a interruzione esterna
Chiude il ServerSocket
Server concorrente
Crea un ServerSocket
Imposta il tempo di attesa massimo
Ripete
Attende
Se (ha ricevuto un datagramma)
Crea un nuovo socket
Crea un thread per gestire il client
Crea uno stream di input
Crea uno stream di output
Finché non ha finito
Trasmette e riceve
Chiude lo stream di output
Chiude lo stream di input
Chiude il socket
Chiude il thread
Fino a interruzione esterna
Chiude il ServerSocket
Il ServerSocket concorrente è utile solamente se nella fase “Trasmette e riceve” c’è una grosse mole di dati, altrimenti è consigliato l’uso di una versione interattiva in quanto c’è un minore uso della CPU e della RAM.
Client (riga di comando):
Trasmette una richiesta e attende una risposta. Lo scambio di dati avviene tramite appositi ImputStream ed OutputStream. Il funzionamento può essere schematizzato così:
Crea un socket
Invia una richiesta di connessione
Se !(timeout)
Crea uno stream di input
Crea uno stream di output
Finché non ha finito
Trasmette e riceve
Chiude lo stream di output
Chiude lo stream di input
Chiude il socket
Client (GUI):
Il metodo BIND
Se il server ha più di una interfaccia di rete, virtuale o fisica, si usa il metodo bind per specificare una determinata interfaccia di rete. È usata cioè per specificare la prima parte dalla socket pair. Viene usata sul lato server per specificare la porta (e gli eventuali indirizzi locali) su cui poi ci si porrà in ascolto.