Ing. Informatico, Insegnante, Musicista

Ultimi articoli

24-11-2021
Un esercizio sfizzioso per i neofiti del JavaScript ma non difficilissimo: costruire un piccolo qui ...
20-11-2021
Le nuove tecnologie fortemente orientate alle reti di telecomunicazioni richiedono nuove e sofistic ...
06-11-2021
Un esercizio svolto sui libri di testo in ogni salsa. Approfittiamo per vedere alcune finezze del c ...
05-11-2021
Somma i primi 20 numeri naturali e mostra il risultato
04-11-2021
Vediamo un'applicazione interessante mista tra programmazione ad oggetti in Java e l'uso di una GUI ...
02-11-2021
Un classico esempio introduttivo per capire il concetto di ereditarietà nella programmazione ad ogg ...
Leggi tutto contenuto

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.