Python 3 - Lezioni su Concetti Intermedi

08: Server-Client TCP Parte Seconda

Ciao a tutti ragazzi e ragazze, in questa seconda puntata dedicata ai socket faremo comunicare una coppia Server-Client TCP da noi creata.

Utilizzeremo i moduli socket per la connessione, subprocess per l'elaborazione delle richieste e sys in caso di errore per uscire dal sistema. Il client potrà effettuare richieste al server, che risponderà dopo aver processato la richiesta effettuata tramite il modulo subprocess.

Scriveremo due script, uno chiamato sub_server e uno chiamato sub_client, responsabili rispettivamente della parte server e della parte client. Il questa seconda parte ci dedicheremo alla scrittura dello script per il server.

I passi da seguire per la creazione di un client TCP col modulo socket sono i seguenti:

# Creazione CLIENT SOCKET:
--------------------------------
# 1 - Creazione socket                      # socket.socket()
# 2 - Connessione al Server                 # connect(indirizzo)
# 3 - Invio di una Richiesta al Server      # send()
# 4 - Ricezione della Risposta dal Server   # recv()

Tra le funzioni generiche di socket utilizzate nello script abbiamo:

# Funzioni Generiche:
--------------------------------
# s.recv()                 => Riceve messaggi TCP
# s.send()                 => Trasmette messaggi TCP
# s.close()                => Chiude il Socket
# socket.gethostname()     => Restituisce l'hostname della macchina su cui sta girando l'Interprete di Python
# socket.gethostbyname()   => Restituisce l'IP associato al nome passato

Mentre le funzioni specifiche per il lato server sono:

# Creazione SERVER SOCKET:
--------------------------------
# 1 - Creazione socket                                                              # socket.socket()
# 2 - Collegamento del socket all'indirizzo della macchina e alla Porta Designata   # bind()
# 3 - Messa in ascolto in attesa della connessione del Client                       # listen()
# 4 - Accettazione del Client                                                       # accept()
# 5 - Ricezione Richiesta dal Client                                                # recv()
# 4 - Elaborazione di una Risposta                                                  # subprocess()						
# 5 - Invio Risposta al Client                                                      # send()

Di seguito trovate il codice utilizzato nello script sub_server, vi invito a guardare il video per commenti e spiegazioni al riguardo!

import socket
import subprocess


def ricevi_comandi(conn):
    while True:
        richiesta = conn.recv(4096)
        risposta = subprocess.run(richiesta.decode(), shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
        data = risposta.stdout + risposta.stderr
        conn.sendall(data)


def sub_server(indirizzo, backlog=1):
    try:
        s = socket.socket()                    
        s.bind(indirizzo)                     
        s.listen(backlog)                     
        print("Server Inizializzato. In ascolto...")
    except socket.error as errore:
        print(f"Qualcosa è andato storto... \n{errore}")
        print(f"Sto tentando di reinizializzare il server...")
        sub_server(indirizzo, backlog=1)
    conn, indirizzo_client = s.accept() #conn = socket_client
    print(f"Connessione Server - Client Stabilita: {indirizzo_client}")
    ricevi_comandi(conn)


if __name__ == '__main__':
    sub_server(("", 20000))

N.B. Lo script qui esposto non è stato pensato per simulare una shell completa ma bensì per fini didattici legati alla coppia Server-Client. Divertitevi a migliorare il codice come meglio credete!

Happy Coding!

Menu della Serie