Python - Programmazione socket

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.

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. Usiamo il modulo socket in python per creare e utilizzare i socket.

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 con quattro punti o un indirizzo IPV6 in notazione con due punti (e possibilmente con un 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.

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.

Adesso chiama 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 di connessione che rappresenta la connessione a quel client.

#!/usr/bin/python           # This is server.py file
import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port
s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   c.send('Thank you for connecting')
   c.close()                # Close the connection

Un semplice cliente

Scriviamo un programma client molto semplice che apra una connessione a una data porta 12345 e un determinato 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.

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/python           # This is client.py file
import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.connect((host, port))
print s.recv(1024)
s.close                     # Close the socket when done

Ora esegui questo server.py in background e poi esegui sopra client.py 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

Ciò produrrebbe il seguente risultato:

Got connection from ('127.0.0.1', 48437)
Thank you for connecting

Socket con URL pubblico

Nell'esempio seguente utilizziamo alcuni metodi dal modulo socket per trovare le informazioni sull'indirizzo del server e i dettagli del nome host.

import socket
from pprint import pprint
# get server address
addrinfo = socket.getaddrinfo('tutorialspoint.com', 'www')
pprint(addrinfo)
# get server hostname
print socket.gethostname()

Quando eseguiamo il programma sopra, otteniamo il seguente output:

[(2, 1, 0, '', ('94.130.81.180', 80))]
DESKTOP-JXYKQCPLP