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.
Ultima modifica 19 Febbraio 2022