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