Socket

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