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:

https://pastebin.com/8Bk19RYX

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:

https://pastebin.com/QmfG7tBb

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):

https://pastebin.com/rFdMxcUX

Piccola applicazione per lo scambio della data (un piccolo messaggio testuale) in TCP

Server:

https://pastebin.com/Lzag6M4u

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):

https://pastebin.com/gMBwCmee

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):

https://pastebin.com/46dSKVxh

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.

results matching ""

    No results matching ""