Giovedì, 06 Giugno 2019 09:12

Un semplice client/server con socket in Python 3

Scritto da

Un piccolo codice sorgente per creare un server con il relativo client. I due nodi costruiscono una connessione con socket e si scambiano un classico messaggio "Hello world". Vediamo quali sono le primitive da usare per creare la connessione e lo scambio in Python.

Questa versione funziona con Python 3. In alto,dentro la variabile HOST,mettiamo come stringa o il nome del pc su cui facciamo girare il nostro server o il suo IP o l'IP di loop 127.0.0.1

Scegliamo quindi una delle porte IANA non riservata (la lista completa qui). A questo punto è facile aprire un socket IP/porta. Con la chiamata listen il server rimane in attesa di una connessione che dopo essere stata accettata, viene processata la comunicazione inviata dal client. Importante: il buffer di 1024 bit deve essere uguale concordato con il client. Il buffer decide la dimensione dei pacchetti in pratica con ci inviare il messaggio e deve essere una potenza di 2 fino ad un massimo suggerito di 4096. Ovviamente più è piccolo il numero più c'è una frammentazione ma abbiamo vantaggi prestazionali per corrispondenza con le prestazione dei router e vari dispositivi di rete.

# Programma server 
import socket

HOST = 'CAD-MASTER'       # Nome o IP che rappresenta il server locale
PORT = 50000              # Porta non privilegiata  tra 49152 e 65535
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
print ("Attendo...")
s.listen(1)
conn, addr = s.accept()
print ('Si è connesso: ', addr)
while True:
    data = conn.recv(1024)
    if not data:
        break
    else:
        print ("Il client dice: "+ data.decode("utf-8"))
        break

conn.close()

 

Il client semplicemente crea la connessione ed invia un messaggio. Il socket scambia messaggi in formato binario, quindi in Python 3 occorre effettuare una codifica/decodifica del messaggio, in questo caso una semplice stringa di testo, ma potrebbe essere anche un valore numerico. Se il messaggio è inviato il client stampa un messaggio di successo e chiude la connessione.

# Programma client
import socket

HOST = 'CAD-MASTER' # Il nodo remoto con nome o IP
PORT = 50000        # La stessa porta usata dal server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
m = "Hello world"
encodem = m.encode('utf-8')
inviato = s.send(encodem)
if (inviato):
    print ("Ho inviato il messaggio")
s.close()

 

Per testare il nostro codice, ci basta aprire due console se siamo su linux o due IDLE se siamo su windows e andare a creare due moduli da far girare separatamente. Lanciamo prima il server ovviamente che rimane in attesa e poi il client che scatena le restanti righe di codice. Non ci rimane che verificare i messaggi stampati nelle due console python! Qui sotto l'esempio fatto girare con due moduli IDLE.

Letto 534 volte
Prof. Alfredo Centinaro

Docente di "Scienze e tecnologie informatiche", "Tecnologie e progettazione di sistemi informatici", "Sistemi e Reti" presso IIS Alessandrini-Marino (Teramo), consulente e sviluppatore web. Ha collaborato per anni come sviluppatore presso MHT - Treviso, assistente Sistemi ed elaborazione dell'informazione in UniTE Corso di laurea in Scienze del turismo culturale, tutor presso Telecom Italia Learning Services (L'Aquila)

Joomla SEF URLs by Artio