La prise et ses méthodes

Les sockets sont les extrémités d'un canal de communication bidirectionnel. Ils peuvent communiquer au sein d'un processus, entre des processus sur la même machine ou entre des processus sur des machines différentes. Sur une note similaire, une socket réseau est un point de terminaison dans un flux de communication entre deux programmes s'exécutant sur un réseau informatique tel qu'Internet. C'est purement une chose virtuelle et ne signifie aucun matériel. La prise réseau peut être identifiée par une combinaison unique d'une adresse IP et d'un numéro de port. Les sockets réseau peuvent être implémentées sur un certain nombre de types de canaux différents tels que TCP, UDP, etc.

Les différents termes liés au socket utilisés dans la programmation réseau sont les suivants -

Domaine

Le domaine est la 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.

Type

Le type désigne le type de communication entre deux points de terminaison, généralement SOCK_STREAM pour les protocoles orientés connexion et SOCK_DGRAM pour les protocoles sans connexion.

Protocole

Cela peut être utilisé pour identifier une variante d'un protocole dans un domaine et un type. Sa valeur par défaut est 0. Ceci est généralement omis.

Nom d'hôte

Cela fonctionne comme l'identifiant d'une interface réseau. Un nom d'hôte peut être une chaîne, une adresse à quatre points ou une adresse IPV6 en deux points (et éventuellement un point).

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.

Module de socket de Python pour la programmation de socket

Pour implémenter la programmation de socket en python, nous devons utiliser le module Socket. Voici une syntaxe simple pour créer un socket -

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

Ici, nous devons importer la bibliothèque de sockets, puis créer une simple socket. Voici les différents paramètres utilisés lors de la création de socket -

  • socket_family - Ceci est soit AF_UNIX ou 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.

Méthodes de socket

Dans cette section, nous allons découvrir les différentes méthodes de socket. Les trois différents ensembles de méthodes de socket sont décrits ci-dessous -

  • Méthodes de socket serveur
  • Méthodes de socket client
  • Méthodes générales de socket

Méthodes de socket serveur

Dans l'architecture client-serveur, il existe un serveur centralisé qui fournit le service et de nombreux clients reçoivent le service de ce serveur centralisé. Les clients font également la demande au serveur. Voici quelques méthodes de socket serveur importantes dans cette architecture:

  • socket.bind() - Cette méthode lie l'adresse (nom d'hôte, numéro de port) au socket.

  • socket.listen()- Cette méthode écoute essentiellement les connexions effectuées sur le socket. Il démarre l'écouteur TCP. Backlog est un argument de cette méthode qui spécifie le nombre maximum de connexions en file d'attente. Sa valeur minimale est 0 et sa valeur maximale est 5.

  • socket.accept()- Cela acceptera la connexion client TCP. La paire (conn, address) est la paire de valeurs de retour de cette méthode. Ici, conn est un nouvel objet socket utilisé pour envoyer et recevoir des données sur la connexion et l'adresse est l'adresse liée au socket. Avant d'utiliser cette méthode, les méthodes socket.bind () et socket.listen () doivent être utilisées.

Méthodes de socket client

Le client dans l'architecture client-serveur demande le serveur et reçoit des services du serveur. Pour cela, il n'y a qu'une seule méthode dédiée aux clients -

  • socket.connect(address)- cette méthode de connexion au serveur activement intime ou en termes simples, cette méthode connecte le client au serveur. L'adresse de l'argument représente l'adresse du serveur.

Méthodes générales de socket

Outre les méthodes de socket client et serveur, il existe des méthodes générales de socket, qui sont très utiles dans la programmation de socket. Les méthodes générales de socket sont les suivantes -

  • socket.recv(bufsize)- Comme son nom l'indique, cette méthode reçoit le message TCP du socket. L'argument bufsize représente la taille du tampon et définit le maximum de données que cette méthode peut recevoir à tout moment.

  • socket.send(bytes)- Cette méthode est utilisée pour envoyer des données à la prise qui est connectée à la machine distante. L'argument bytes donnera le nombre d'octets envoyés à la socket.

  • socket.recvfrom(data, address)- Cette méthode reçoit les données du socket. La valeur de deux paires (données, adresse) est renvoyée par cette méthode. Les données définissent les données reçues et l'adresse spécifie l'adresse du socket qui envoie les données.

  • socket.sendto(data, address)- Comme son nom l'indique, cette méthode est utilisée pour envoyer des données depuis le socket. La valeur de deux paires (données, adresse) est renvoyée par cette méthode. Les données définissent le nombre d'octets envoyés et l'adresse spécifie l'adresse de la machine distante.

  • socket.close() - Cette méthode fermera le socket.

  • socket.gethostname() - Cette méthode renverra le nom de l'hôte.

  • socket.sendall(data)- Cette méthode envoie toutes les données à la prise qui est connectée à une machine distante. Il transfère négligemment les données jusqu'à ce qu'une erreur se produise et si cela se produit, il utilise la méthode socket.close () pour fermer le socket.

Programme pour établir une connexion entre le serveur et le client

Pour établir une connexion entre le serveur et le client, nous devons écrire deux programmes Python différents, l'un pour le serveur et l'autre pour le client.

Programme côté serveur

Dans ce programme de socket côté serveur, nous utiliserons le socket.bind()méthode qui le lie à une adresse IP et un port spécifiques afin qu'il puisse écouter les demandes entrantes sur cette IP et ce port. Plus tard, nous utilisons lesocket.listen()méthode qui met le serveur en mode écoute. Le nombre, disons 4, comme argument dusocket.listen()signifie que 4 connexions sont maintenues en attente si le serveur est occupé et si un 5e socket essaie de se connecter, la connexion est refusée. Nous enverrons un message au client en utilisant lesocket.send()méthode. Vers la fin, nous utilisons lesocket.accept() et socket.close()méthode pour lancer et fermer la connexion respectivement. Voici un programme côté serveur -

import socket
def Main():
   host = socket.gethostname()
   port = 12345
   serversocket = socket.socket()
   serversocket.bind((host,port))
   serversocket.listen(1)
   print('socket is listening')
   
   while True:
      conn,addr = serversocket.accept()
      print("Got connection from %s" % str(addr))
      msg = 'Connecting Established'+ "\r\n"
      conn.send(msg.encode('ascii'))
      conn.close()
if __name__ == '__main__':
   Main()

Programme côté client

Dans le programme socket côté client, nous devons créer un objet socket. Ensuite, nous nous connecterons au port sur lequel fonctionne notre serveur - 12345 dans notre exemple. Après cela, nous établirons une connexion en utilisant lesocket.connect()méthode. Puis en utilisant lesocket.recv()méthode, le client recevra le message du serveur. Enfin, lesocket.close() la méthode fermera le client.

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = socket.gethostname()
port = 12345

s.connect((host, port))
msg = s.recv(1024)

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

Maintenant, après avoir exécuté le programme côté serveur, nous obtiendrons la sortie suivante sur le terminal -

socket is listening
Got connection from ('192.168.43.75', 49904)

Et après avoir exécuté le programme côté client, nous obtiendrons la sortie suivante sur un autre terminal -

Connection Established

Gestion des exceptions de socket réseau

Il y a deux blocs à savoir try et exceptqui peut être utilisé pour gérer les exceptions de socket réseau. Voici un script Python pour la gestion des exceptions -

import socket
host = "192.168.43.75"
port = 12345
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

try:
   s.bind((host,port))
   s.settimeout(3)
   data, addr = s.recvfrom(1024)
   print ("recevied from ",addr)
   print ("obtained ", data)
   s.close()
except socket.timeout :
   print ("No connection between client and server")
   s.close()

Production

Le programme ci-dessus génère la sortie suivante -

No connection between client and server

Dans le script ci-dessus, nous avons d'abord créé un objet socket. Cela a été suivi en fournissant l'adresse IP de l'hôte et le numéro de port sur lequel notre serveur fonctionne - 12345 dans notre exemple. Plus tard, le bloc try est utilisé et à l'intérieur en utilisant lesocket.bind()méthode, nous essaierons de lier l'adresse IP et le port. Nous utilisonssocket.settimeout()méthode pour définir le temps d'attente pour le client, dans notre exemple, nous définissons 3 secondes. Le bloc except est utilisé qui imprimera un message si la connexion ne sera pas établie entre le serveur et le client.