Programmazione di rete in python: Introduzione alle reti

python01

Prima di iniziare con la programmazione di rete in python ho deciso di fare una piccola introduzione sull’argomento, ovviamente questo articolo non sarà completo in quanto l’argomento è molto vasto infatti a tal proposito esistono interi libri ed esami universitari su quest’argomento ma per il nostro scopo il seguente articolo sarà più che sufficiente.

Una rete di calcolatori è un sistema che permette la condivisione di dati informativi e risorse tra diversi calcolatori. All’interno di una rete di calcolatori la comunicazione avviene tramite scambio di informazioni (messaggi),per comunicare sono necessari:

Un calane fisico:

Cavo telefonico, fibra ottica, onde radio, ecc

Un linguaggio comune: protocollo di comunicazione

Insieme di regole formalmente descritte, definite al fine di favorire la comunicazione tra una o più entità.

Quindi sostanzialmente l’obbiettivo principale delle reti è scambiare informazioni tra i computer, queste info vengono trasportate dai pacchetti, I pacchetti sono dei flussi di bit , che vengono spediti come segnali elettrici questi segnali vengono poi interpretati come bit(0/1) che compongono l’informazione vera e propria.Tutti i pacchetti hanno la seguente struttura:

figure_001

L’header ha una struttura che dipende dal protocollo, ciò consente all’host che riceve il pacchetto possa interpretare correttamente il payload e gestire la comunicazione.

il payload è l’informazione vera e propria. Potrebbe essere qualcosa come una parte di un messaggio email o il contenuto di un file durante un download.

Modello ISO/OSI

Il modello ISO/OSI è formato da sette livelli ed è usato come modello di riferimento durante l’implementazione dei protocolli in produzione. Il funzionamento è il seguente:

L’intero pacchetto del protocollo superiore (header e payload)  diventa il payload del livello inferiore questo meccanismo è chiamato incapsulamento.

Osi-model

Networking per le applicazioni

Le applicazioni più diffuse per utilizzare le funzionalità di rete si appoggiano direttamente sui protocolli TCP o UDP della suite di protocolli Internet.

Il protocollo TCP (Transfer Control Protocol) è un protocollo di alto livello orientato alla connessione e che esegue controlli sugli errori, un destinatario “TCP” è identificato da un indirizzo IP e da una porta di destinazione.

Socket (TCP)

L’astrazione principale per la programmazione di rete è il Socket:

– Identifica le risorse che permettono di stabilire un canale di comunicazione con un altro processo (eventualmente su un’altra macchina).

– Tutto quello che viene trasmesso sono pacchetti TCP.

Ora che abbiamo fatto questa piccola introduzione sporchiamoci le mani con un pò di codice:

Esempio Server TCP

# coding=utf-8
import socket
import threading
#Il nostro server sarà in ascolto sul seguente indirizzo e porta

indirizzo="0.0.0.0"
porta = 9999

#Creiamo una socket, il parametro AF_INET indica che useremo un indirizzo IPv4
# SOCK_STREAM indica che vogliamo creare un socket TCP
server =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((indirizzo,porta))#stiamo in ascolto
server.listen(3)#3 connessioni per volta

#creiamo una funzione per la gestione del client
def GestioneClient(client_sock):
 #salviamo la richiesta del client nella variabile request
 request = client_sock.recv(1024)
 print request
 #inviamo un messaggio al client
 client_sock.send("Messaggio ricevuto")
 #chiuduamo la connession
 client_sock.close()

while True:
 #Assegnamo il socket del client alla var client e i dettagli della connessione alla var addr
 client,addr=server.accept()
 print "Connessione accettata da parte %s %d" % (addr[0],addr[1])
 #Avviamo un thread per gestire i dati in arrivo da parte del client
 cl=threading.Thread(target=GestioneClient,args=(client,))
 cl.start()

Esempio Client TCP

# coding=utf-8
import socket

indirizzo="0.0.0.0"
porta = 9999

#creo una socket
sc =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sc.connect((indirizzo,porta))

#invio i dati
sc.send("Hello world")

#ricevo i dati dal server
risposta=sc.recv(4096)
print risposta

Esercizi

  1. Il client prende una stringa di testo da input e lo invia al client
  2. il sever continua a mantenere la connessione finchè non riceve la stringa fine

Altri tutorial sul linguaggio python sono reperibili presso il seguente link. Mentre per domande e richieste potete contattarci sulla nostra pagina di facebook