L'utilizzo dei socket in Python è estremamente facile, data la chiara gestione che ne ha il linguaggio.
Socket server
Per fare un esempio pratico, vediamo adesso come è facile creare con Python un ipotetico server in ascolto su una porta casuale, nel nostro caso 4000. Iniziamo con l'importare la libreria dedicata ai socket in Python e con il creare il nostro socket server:
from socket import * porta = 4000 server = socket(AF_INET, SOCK_STREAM) server.bind((socket.gethostname(), porta)) server.listen(5)
E' bene chiarire cosa abbiamo fatto; nelle prime due istruzioni, viene importata la libreria riguardante i socket e dichiarata la porta sulla quale vogliamo metterci in ascolto.
L'istruzione successiva è fondamentale, poichè è quella che crea il nostro socket server. AF_INET rappresenta il tipo di socket è l'indirizzo utilizzato. Nel caso specifico, AF_INET rappresenta il protocollo TCP/IP con indirizzo ip IPv4; SOCK_STREAM indica invece il tipo di socket utilizzato. Verranno riepilogati alla fine i principali tipi di socket e di costanti protocollo/indirizzo.
Nell'istruzione successiva viene utilizzato socket.gethostname() al fine di rendere visibile il socket dall'esterno: se al suo posto avessimo inserito "localhost" o "127.0.0.1" il socket sarebbe stato visibile soltanto all'interno della nostra macchina. server.listen(5) indica la possibilità di accettare al massimo cinque connessione e di rifutare quelle successive. Normalmente cinque è il massimo consentito.
while 1: connection, address = server.accept() data = connection.recv(1024) print data if data: message = "Connessione stabilita con successo." connection.send(message) else: break connection.close()
Vediamo di chiarire questa parte di codice, che è il fulcro del nostro socket.
Il tutto si apre con un while 1, che indica che il server rimarrà in ascolto fino alla connessione di un client, e si chiuderà solo nel caso di chiusura volontaria o errore nel socket. Nella seconda riga, indichiamo invece di accettare la connessione con il client, nel caso avvenga. data = connection.recv(1024) indica che è possibile ricevere solo fino ad un kilobyte (1024).
Adesso, nel caso i dati vengano ricevuti, vengono stampati a schermo e viene inviato il messaggio che indica l'avvenuta connessione (message). In caso contrario, il ciclo viene interrotto dal comando break ed avviene la disconnessione con connection.close().
Socket client
Vediamo ora di creare un socket client che interagisca con il socket server sopra proposto. Anche in questo caso, importiamo la libreria dedicata ai socket in Python, socket.
from socket import * Host_server = "127.0.0.1" # L'host del server in questo caso corrisponde al localhost poiché stiamo lavorado in locale, ma cambierà a seconda della posizione del server in ascolto Port_server = 4000 client = socket(AF_INET, SOCK_STREAM) client.connect((Host_server, Port_server)) client.send("Connessione avvenuta con successo.") data = client.recv(1024) print data
Affrontiamo le istruzioni nuove, infatti noteremo che molte ci risultano familiari dopo il socket server. L'istruzione principale è client.connect(server, port), che ci permette di collegarci al nostro server in ascolto. Dopodiché, verrà semplicemente inviato un messaggio in caso di corretta trasmissione dati.
Riepilogo tipi socket e costanti
Ecco l'elenco di socket e tipi di costanti protocollo/indirizzo utilizzabili in Python:
Costanti:
AF_UNIX
AF_INET
AF_INET6
Tipi di socket:
SOCK_STREAM
SOCK_DGRAM
SOCK_RAW
SOCK_RDM
SOCK_SEQPACKET
Aggiungi un commento