ordinare una lista

Socket Python 3.9 – Client e Server

In questa lezione parliamo di Socket Python e analizziamo tutte le possibili funzioni tramite le quali possiamo costruire una semplice comunicazione tra Server e Client.

La teoria è importante ...

Prima di partire con la scrittura del codice, è bene, come in ogni esercizio svolto da me che puoi analizzare nella sezione apposita, stilare un’analisi ben definita in modo da capire e svolgere l’algoritmo in maniera ottimizzata predendo in considerazione tutti gli errori che potrebbero verificarsi durante l’esecuzione del programma.

Socket

Il socket non è altro che un oggetto software che permette l’invio e la ricezione di dati, tra host remoti o tra processi locali. Esso si basa sul modello Input/Output su file di Unix, quindi sulle operazioni di open, read, write e close;  Per la comunicazione tra host abbiamo bisogno di utilizzare dei parametri quali indirizzi, numeri di porta e protocolli. 

Per chi ha studiato informatica in maniera più approfondita, possiamo vedere i socket come degli intermediari tra il livello applicazione e di trasporto nello stack TCP/IP. Infatti la funzione dei socket è quella di indirizzamento dei processi.

Famiglie di socket

I tipi di protocolli utilizzati dal socket, ne definiscono la famiglia. Possiamo distinguere, ad esempio, due importanti famiglie:

  • AF_INET: comunicazione tra host remoti, tramite Internet;
  • AF_UNIX: comunicazione tra processi locali, su macchine Unix. Questa famiglia è anche chiamata Unix Domain Socket.

Le porte

Esse vengono utilizzate per indirizzare precisamente il processo con cui si sta dialogando. Inoltre, in maniera più specifica, possiamo definirle come dei numeri che identificano i processi in esecuzione.

Stream Socket Python

Gli Stream Socket sono orientati alla connessione (connection-oriented), quindi basati su protocolli affidabili come TCP o SCTP; Oltre a questo tipo di Socket, esistono:

  • Datagram Socket : non orientati alla connessione (connectionless), basati sul protocollo veloce ma inaffidabile UDP;
  • Raw socket (raw IP): il livello di trasporto viene bypassato, e l’header è accessibile al livello applicativo.

Client-Server Python - HOW TO

socket python

Vediamo ora le operazioni utili a realizzare la comunicazione tra Client e Server per questo tipo di Socket:

  • Client e server creano i loro rispettivi socket, e il server lo pone in ascolto su una porta. Questa fase quindi possiamo chiamarla come “Creazione del socket“. Esso viene realizzato tramite funzione del modulo Socket Python. Tra i parametri passabili alla funzione, socket_family corrisponde alla tipologia di indirizzo con cui vogliamo lavorare, di default abbiamo AF_INET che sta per gli indirizzi IPv4. A socket_type corrisponde invece la tipologia di socket che vogliamo creare, di default abbiamo SOCK_STREAM per socket di tipo TCP. Inoltre, dato che il server può creare più connessioni con client diversi, ha bisogno di una coda per gestire le varie richieste, che analizziamo al momento della realizzazione del Socket Python.
 s = socket.socket(socket_family, socket_type)
  • Il client effettua una richiesta di connessione verso il server. Il server riceve la richiesta e, nel caso in cui sia accettata, viene creata una nuova connessione.
  • Ora client e server comunicano attraverso un canale virtuale, tra il socket del primo, ed uno nuovo del server, creato appositamente per il flusso dei dati di questa connessione: data socket.
  • Essendo il TCP un protocollo orientato alla connessione, quando non si ha più la necessità di comunicare, il client lo comunica al server. La connessione viene così chiusa.

Il codice qui sotto rappresenta la creazione di un Client in maniera molto scarna, ma da questo punto di partenza abbiamo la possibilità di creare un programma socket python più completo ed esteso.

import socket

HOST = '127.0.0.1'  # The server's hostname or IP address
PORT = 65432        # The port used by the server

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.connect((HOST, PORT))
    s.sendall(b'Hello, world')
    data = s.recv(1024)

print('Received', repr(data))

Una volta creato il Client grazie all’utilizzo del modulo socket python, andiamo a realizzare la parte Server. I passaggi sottostanti rappresentano i passaggi utili alla creazione del Server.

  1. Creazione del socket
  2. Collegamento socket all’indirizzo e porta designata
  3. Attesa e messa in ascolto
  4. Accettazione Client
  5. Ricezione Client
  6. Creazione e invio risposta
import socket

HOST = '127.0.0.1'  # Standard loopback interface address (localhost)
PORT = 65432        # Port to listen on (non-privileged ports are > 1023)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen()
    conn, addr = s.accept()
    with conn:
        print('Connected by', addr)
        while True:
            data = conn.recv(1024)
            if not data:
                break
            conn.sendall(data)

Come avete potuto intuire, il progamma eseguito non comporta nessuno stile grafico o indicazione particolare. Questo perchè voglio focalizzare l’attenzione sul funzionamento di un socket attraverso il linguaggio di programmazione Python.

Ovviamente, per chi volesse approfondire, basterà consultare la guida messa a disposizione da Python e provare a creare dei software veramente completi. Questa è solamente la prima versione, completeremo il nostro percorso in questo ampio argomento con le prossme lezioni.

Condividi il post

Condividi su facebook
Condividi su google
Condividi su twitter
Condividi su email
Condividi su whatsapp