Server-Client TCP Parte Prima

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 prima parte ci dedicheremo alla scrittura dello script per il client.

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 la funzione specifica per il lato client è la funzione connect():

# Funzioni Client Socket:
--------------------------------
# s.connect()    => Inizia la connessione col Server. Richiede un Tuple contenente IP e Porta del Servizio

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

import socket
import sys

def invia_comandi(s):
    while True:
        comando = input("-> ")
        if comando == "ESC":
            print("Sto chiudendo la connessione col Server.")
            s.close()
            sys.exit()
        else:
            s.send(comando.encode())
            data = s.recv(4096)
            print(str(data, "utf-8"))

def conn_sub_server(indirizzo_server):
    try:
        s = socket.socket()             # creazione socket client
        s.connect(indirizzo_server)     # connessione al server
        print(f"Connessessione al Server: { indirizzo_server } effettuata.")
    except socket.error as errore:
        print(f"Qualcosa è andato storto, sto uscendo... \n{errore}")
        sys.exit()
    invia_comandi(s)

if __name__ == '__main__':
    conn_sub_server(("192.168.1.6", 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!