Python - Programmation de sockets

Python fournit deux niveaux d'accès aux services réseau. À un niveau bas, vous pouvez accéder à la prise en charge de socket de base dans le système d'exploitation sous-jacent, qui vous permet d'implémenter des clients et des serveurs pour les protocoles orientés connexion et sans connexion.

Python dispose également de bibliothèques qui fournissent un accès de niveau supérieur à des protocoles réseau spécifiques au niveau de l'application, tels que FTP, HTTP, etc.

Les sockets sont les extrémités d'un canal de communication bidirectionnel. Les sockets peuvent communiquer au sein d'un processus, entre des processus sur la même machine ou entre des processus sur différents continents. Nous utilisons le module socket en python pour créer et utiliser des sockets.

Les sockets ont leur propre vocabulaire -

Sr.No. Terme et description
1

Domain

Famille de protocoles utilisée comme mécanisme de transport. Ces valeurs sont des constantes telles que AF_INET, PF_INET, PF_UNIX, PF_X25, etc.

2

type

Type de communication entre les deux points de terminaison, généralement SOCK_STREAM pour les protocoles orientés connexion et SOCK_DGRAM pour les protocoles sans connexion.

3

protocol

Typiquement zéro, cela peut être utilisé pour identifier une variante d'un protocole dans un domaine et un type.

4

hostname

L'identifiant d'une interface réseau -

  • Une chaîne, qui peut être un nom d'hôte, une adresse à quatre points ou une adresse IPV6 en notation deux-points (et éventuellement un point)

  • Une chaîne "<broadcast>", qui spécifie une adresse INADDR_BROADCAST.

  • Une chaîne de longueur nulle, qui spécifie INADDR_ANY, ou

  • Un entier, interprété comme une adresse binaire dans l'ordre des octets de l'hôte.

5

port

Chaque serveur écoute les clients appelant sur un ou plusieurs ports. Un port peut être un numéro de port Fixnum, une chaîne contenant un numéro de port ou le nom d'un service.

Le module de prise

Pour créer une socket, vous devez utiliser la fonction socket.socket () disponible dans le module socket , qui a la syntaxe générale -

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

Voici la description des paramètres -

  • socket_family - Il s'agit soit d'AF_UNIX, soit d'AF_INET, comme expliqué précédemment.

  • socket_type - Il s'agit soit de SOCK_STREAM, soit de SOCK_DGRAM.

  • protocol - Ceci est généralement laissé de côté, par défaut à 0.

Une fois que vous avez un objet socket , vous pouvez utiliser les fonctions requises pour créer votre programme client ou serveur.

Méthodes de socket serveur

Sr.No. Méthode et description
1

s.bind()

Cette méthode lie l'adresse (nom d'hôte, paire de numéros de port) au socket.

2

s.listen()

Cette méthode configure et démarre l'écouteur TCP.

3

s.accept()

Cela accepte passivement la connexion client TCP, en attendant que la connexion arrive (blocage).

Méthodes de socket client

Sr.No. Méthode et description
1

s.connect()

Cette méthode initie activement la connexion au serveur TCP.

Méthodes générales de socket

Sr.No. Méthode et description
1

s.recv()

Cette méthode reçoit un message TCP

2

s.send()

Cette méthode transmet le message TCP

3

s.recvfrom()

Cette méthode reçoit un message UDP

4

s.sendto()

Cette méthode transmet un message UDP

5

s.close()

Cette méthode ferme le socket

6

socket.gethostname()

Renvoie le nom d'hôte.

Un serveur simple

Pour écrire des serveurs Internet, nous utilisons le socketfonction disponible dans le module socket pour créer un objet socket. Un objet socket est ensuite utilisé pour appeler d'autres fonctions afin de configurer un serveur socket.

Appelez maintenant bind(hostname, port)pour spécifier un port pour votre service sur l'hôte donné.

Ensuite, appelez la méthode accept de l'objet retourné. Cette méthode attend jusqu'à ce qu'un client se connecte au port que vous avez spécifié, puis renvoie un objet de connexion qui représente la connexion à ce 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 client simple

Écrivons un programme client très simple qui ouvre une connexion vers un port donné 12345 et un hôte donné. C'est très simple de créer un client socket en utilisant la fonction de module socket de Python .

le socket.connect(hosname, port )ouvre une connexion TCP au nom d' hôte sur le port . Une fois que vous avez une socket ouverte, vous pouvez la lire comme n'importe quel objet IO. Une fois terminé, n'oubliez pas de le fermer, comme vous le feriez pour un fichier.

Le code suivant est un client très simple qui se connecte à un hôte et un port donnés, lit toutes les données disponibles à partir du socket, puis quitte -

#!/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

Maintenant, exécutez ce server.py en arrière-plan, puis exécutez ci-dessus client.py pour voir le résultat.

# Following would start a server in background.
$ python server.py & # Once server is started run client as follows: $ python client.py

Cela produirait le résultat suivant -

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

Socket avec URL publique

Dans l'exemple ci-dessous, nous utilisons quelques méthodes du module socket pour trouver les informations d'adresse du serveur et les détails du nom d'hôte.

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

Lorsque nous exécutons le programme ci-dessus, nous obtenons la sortie suivante -

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