Python 3 - Programmazione di rete

Python fornisce due livelli di accesso ai servizi di rete. A un livello basso, è possibile accedere al supporto socket di base nel sistema operativo sottostante, che consente di implementare client e server per protocolli orientati alla connessione e senza connessione.

Python dispone anche di librerie che forniscono un accesso di livello superiore a specifici protocolli di rete a livello di applicazione, come FTP, HTTP e così via.

Questo capitolo fornisce una comprensione del concetto più famoso di Networking: Socket Programming.

Cosa sono i socket?

I socket sono gli endpoint di un canale di comunicazione bidirezionale. I socket possono comunicare all'interno di un processo, tra processi sulla stessa macchina o tra processi su continenti diversi.

I socket possono essere implementati su diversi tipi di canali: socket di dominio Unix, TCP, UDP e così via. La libreria socket fornisce classi specifiche per la gestione dei trasporti comuni, nonché un'interfaccia generica per la gestione del resto.

Le prese hanno il loro vocabolario -

Sr.No. Termine e descrizione
1

domain

La famiglia di protocolli utilizzata come meccanismo di trasporto. Questi valori sono costanti come AF_INET, PF_INET, PF_UNIX, PF_X25 e così via.

2

type

Il tipo di comunicazione tra i due endpoint, in genere SOCK_STREAM per i protocolli orientati alla connessione e SOCK_DGRAM per i protocolli senza connessione.

3

protocol

Tipicamente zero, può essere utilizzato per identificare una variante di un protocollo all'interno di un dominio e tipo.

4

hostname

L'identificatore di un'interfaccia di rete -

  • Una stringa, che può essere un nome host, un indirizzo a quattro punti o un indirizzo IPV6 in notazione con due punti (e possibilmente punto)

  • Una stringa "<broadcast>", che specifica un indirizzo INADDR_BROADCAST.

  • Una stringa di lunghezza zero, che specifica INADDR_ANY o

  • Un numero intero, interpretato come un indirizzo binario nell'ordine dei byte dell'host.

5

port

Ogni server ascolta i client che chiamano su una o più porte. Una porta può essere un numero di porta Fixnum, una stringa contenente un numero di porta o il nome di un servizio.

Il modulo socket

Per creare un socket, è necessario utilizzare la funzione socket.socket () disponibile nel modulo socket, che ha la sintassi generale -

s = socket.socket (socket_family, socket_type, protocol = 0)

Ecco la descrizione dei parametri:

  • socket_family - Questo è AF_UNIX o AF_INET, come spiegato in precedenza.

  • socket_type - Questo è SOCK_STREAM o SOCK_DGRAM.

  • protocol - Questo di solito viene omesso, il valore predefinito è 0.

Dopo aver ottenuto l' oggetto socket , è possibile utilizzare le funzioni richieste per creare il programma client o server. Di seguito è riportato l'elenco delle funzioni richieste:

Metodi socket server

Sr.No. Metodo e descrizione
1

s.bind()

Questo metodo associa l'indirizzo (nome host, coppia di numeri di porta) al socket.

2

s.listen()

Questo metodo imposta e avvia il listener TCP.

3

s.accept()

Questo accetta passivamente la connessione client TCP, in attesa dell'arrivo della connessione (blocco).

Metodi socket client

Sr.No. Metodo e descrizione
1

s.connect()

Questo metodo avvia attivamente la connessione al server TCP.

Metodi socket generali

Sr.No. Metodo e descrizione
1

s.recv()

Questo metodo riceve il messaggio TCP

2

s.send()

Questo metodo trasmette il messaggio TCP

3

s.recvfrom()

Questo metodo riceve il messaggio UDP

4

s.sendto()

Questo metodo trasmette il messaggio UDP

5

s.close()

Questo metodo chiude il socket

6

socket.gethostname()

Restituisce il nome host.

Un semplice server

Per scrivere server Internet, utilizziamo il socketfunzione disponibile nel modulo socket per creare un oggetto socket. Un oggetto socket viene quindi utilizzato per chiamare altre funzioni per configurare un server socket.

Ora chiama il bind(hostname, port)funzione per specificare una porta per il servizio sull'host specificato.

Quindi, chiama il metodo di accettazione dell'oggetto restituito. Questo metodo attende che un client si connetta alla porta specificata, quindi restituisce un oggetto connessione che rappresenta la connessione a quel client.

#!/usr/bin/python3           # This is server.py file
import socket                                         

# create a socket object
serversocket = socket.socket(
	        socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999                                           

# bind to the port
serversocket.bind((host, port))                                  

# queue up to 5 requests
serversocket.listen(5)                                           

while True:
   # establish a connection
   clientsocket,addr = serversocket.accept()      

   print("Got a connection from %s" % str(addr))
    
   msg = 'Thank you for connecting'+ "\r\n"
   clientsocket.send(msg.encode('ascii'))
   clientsocket.close()

Un cliente semplice

Scriviamo un programma client molto semplice che apra una connessione a una data porta 12345 e un dato host. È molto semplice creare un client socket utilizzando la funzione del modulo socket di Python .

Il socket.connect(hosname, port )apre una connessione TCP al nome host sulla porta . Una volta aperto un socket, puoi leggere da esso come qualsiasi oggetto IO. Quando hai finito, ricordati di chiuderlo, come faresti per chiudere un file.

Esempio

Il codice seguente è un client molto semplice che si connette a un determinato host e porta, legge tutti i dati disponibili dal socket e quindi esce:

#!/usr/bin/python3           # This is client.py file

import socket

# create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# get local machine name
host = socket.gethostname()                           

port = 9999

# connection to hostname on the port.
s.connect((host, port))                               

# Receive no more than 1024 bytes
msg = s.recv(1024)                                     

s.close()
print (msg.decode('ascii'))

Ora esegui questo server.py in background e quindi esegui il client.py sopra per vedere il risultato.

# Following would start a server in background.
$ python server.py & 

# Once server is started run client as follows:
$ python client.py

Produzione

Ciò produrrebbe il seguente risultato:

on server terminal
Got a connection from ('192.168.1.10', 3747)
On client terminal
Thank you for connecting

Moduli Internet Python

Di seguito viene fornito un elenco di alcuni moduli importanti nella programmazione di rete / Internet Python:

Protocollo Funzione comune Porta n Modulo Python
HTTP pagine web 80 httplib, urllib, xmlrpclib
NNTP Notizie Usenet 119 nntplib
FTP Trasferimenti di file 20 ftplib, urllib
SMTP Invio di e-mail 25 smtplib
POP3 Recupero email 110 poplib
IMAP4 Recupero email 143 imaplib
Telnet Righe di comando 23 telnetlib
Gopher Trasferimenti di documenti 70 gopherlib, urllib

Controlla tutte le librerie sopra menzionate per funzionare con i protocolli FTP, SMTP, POP e IMAP.

Ulteriori letture

Questo è stato un rapido inizio con la programmazione socket. È un argomento vasto. Si consiglia di passare attraverso il seguente collegamento per trovare maggiori dettagli:

  • Programmazione socket Unix .

  • Libreria e moduli Python Socket .