Programmation de sockets en Python : Bibliothèques client, serveur, pair
Published: 2023-12-11 09:23:13

Dans ce tutoriel, vous apprendrez à échanger des données entre un client et un serveur en utilisant la programmation de sockets Python et l'API Socket. Plus tard, ce tutoriel abordera l'échange de données directement entre deux ou plusieurs clients Python en utilisant un fournisseur hébergé. Le code source utilisé dans ce tutoriel peut être trouvé dans le dépôt [dépôt GitHub](https://github.com/PubNubDevelopers/python-socket-demo).

La programmation par sockets connecte deux sockets (un socket client et un socket serveur) et leur permet de communiquer de manière bidirectionnelle en temps réel. Les connexions directes par sockets peuvent bénéficier à toutes les applications en temps réel puisque les données peuvent être envoyées ou reçues à tout moment.

Python est-il adapté à la programmation par socket ?
----------------------------------------------------

Oui ! Python est un excellent choix pour la programmation de sockets car il intègre de nombreux modules nécessaires tels que socket, select et asyncio pour créer des applications client-serveur.

### À quoi servent les sockets Python ?

Les sockets Python sont utilisés pour les applications qui doivent communiquer sur un réseau, comme les serveurs web, les applications de chat ou les clients de messagerie. Le programme serveur écoute et gère les connexions entrantes, tandis que le client se connecte au serveur pour envoyer et recevoir des données. Les sockets Python prennent en charge à la fois [TCP - un](https://www.pubnub.com/guides/tcp-ip/)protocole fiable qui garantit la livraison des paquets dans l'ordre - et [UDP - un](https://www.pubnub.com/guides/udp/)protocole léger et sans connexion pour les applications où la perte de paquets est acceptable.

### Comment exécuter un programme de socket en Python ?

Le guide suivant vous aidera à créer un client et un serveur Python capables de communiquer entre eux. Vous devez exécuter les deux programmes séparément, c'est-à-dire

`python myServer.py`

`python myClient.py`

Mise en place de l'environnement de**programmation Python**
-----------------------------------------------------------

Vous aurez besoin d'une version stable de [Python version 3.x](https://www.python.org/downloads/) Si vous êtes un utilisateur Windows, vous avez la possibilité d'ajouter Python à votre PATH.

Vous aurez également besoin d'un éditeur de code pour suivre ce tutoriel. [Visual Studio Code](https://code.visualstudio.com/) est un éditeur de code libre et gratuit populaire qui prend en charge de nombreux langages et frameworks, y compris Python. VSCode prend également en charge des extensions pour Python afin de faciliter la complétion du code et le débogage.

Créer et exécuter une application socket Python
-----------------------------------------------

Construisons une application socket simple en utilisant Python. Python fournit une classe native [classe de socket](https://docs.python.org/3/library/socket.html) (module socket), de sorte que les développeurs n'ont pas besoin de dépendre de bibliothèques externes. Commencez par configurer le client et le serveur de programmation de sockets Python :

![](https://images.ctfassets.net/3prze68gbwl1/asset-17suaysk1qa1jhj/bf547110b07a076c30bac70e1b5a7e9a/python-socket-connection-diagram.png)

### Importez votre bibliothèque de sockets Python

Créez le fichierclient.py dans le répertoire du projet. Pour utiliser les sockets, importez la bibliothèque de sockets Python et créez un nouvel objet socket qui se connecte à une adresse IP spécifiée (dans ce cas, localhost sur le port 8080, mais vous pouvez sélectionner n'importe quelle adresse ipv4). Créez une nouvelle connexion au serveur socket, envoyez des données au serveur TCP et fermez la connexion socket.

Votre fichier client.py devrait ressembler à ceci :

```js
import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('0.0.0.0', 8080))
client.send("I am CLIENT\n".encode())
from_server = client.recv(4096)
client.close()
print (from_server.decode())
```

Vous aurez besoin d'un serveur de socket pour écouter les connexions entrantes et les messages de votre client. Créez le fichier server.py et ajoutez-y le contenu suivant :

```js
import socket
serv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serv.bind(('0.0.0.0', 8080))
serv.listen(5)
while True:
  conn, addr = serv.accept()
  from_client = ''
  while True:
    data = conn.recv(4096)
    if not data: break
    from_client += data.decode('utf8')
    print (from_client)
    conn.send("I am SERVER\n".encode())
  conn.close()
print ('client disconnected and shutdown')
```

Server.py lie l'objet socket au nom d'hôte (localhost) sur le port 8080 et écoute continuellement les nouvelles connexions du client. Lorsqu'un client se connecte à cette adresse, le serveur accepte la connexion et lit les données. Une fois les données lues avec succès par le client, le serveur fournit une réponse de données, après quoi le client met fin à la connexion.

### Tester votre programmation de sockets Python

Pour tester vous-même, ouvrez simultanément deux fenêtres de terminal. Dans l'une d'elles, exécutez :

```js
python3 server.py
```

Dans la seconde fenêtre, exécutez :

```js
python3 client.py
```

Remarquez que le serveur continue de fonctionner et établit une nouvelle connexion chaque fois que vous exécutez le client et que vous ajoutez une nouvelle sortie.

Le client envoie la chaîne "I am CLIENT" au serveur et attend une réponse. Le serveur lira le message du client, l'affichera sur le terminal et renverra une réponse au client.

![](https://images.ctfassets.net/3prze68gbwl1/6Y2HAKVJOGza5CUHcJyg8k/2480975a9fecd808b273cdf834ecb65b/python_sockets.png)

Programmation de sockets en Python avec PubNub
----------------------------------------------

Jusqu'à présent, ce tutoriel a couvert l'échange de messages entre un serveur et un client, mais que faire si vous avez besoin de communiquer directement entre des clients Python ?

L'envoi de données directement entre deux ou plusieurs appareils clients est délicat car vous vous heurtez à de nombreuses considérations d'échelle et de sécurité à mesure que le nombre d'appareils augmente. Une architecture client-serveur est utilisée pour modérer et gérer votre communication client à client. Si vous n'avez pas de serveur web ou si vous craignez que votre serveur ne s'adapte à la demande de votre application, vous devriez opter pour une solution de communication en temps réel hébergée telle que [PubNub](https://www.pubnub.com/). PubNub est une plateforme cloud globalement distribuée et évolutive, vous n'avez donc pas à vous soucier du déploiement et de la maintenance des serveurs. Les SDK multiplateformes de PubNub, y compris les SDK en [Python](https://www.pubnub.com/docs/sdks/python)Python, permettent d'identifier les utilisateurs et d'envoyer des messages à des canaux spécifiques, que seuls les clients abonnés recevront.

### Programmation de socket Python de client à client

Comment l'application simple présentée précédemment pourrait-elle être écrite avec PubNub pour échanger des messages directement entre deux clients ? Il est essentiel de comprendre que, bien que PubNub utilise l'architecture "publish" et "subscribe" (pub/sub) pour envoyer et recevoir des messages bidirectionnels entre les points d'extrémité, il utilise toujours des sockets dans les coulisses. PubNub vous offre les avantages de la communication par sockets sans vous soucier des détails de la programmation réseau Python et du maintien d'une connexion permanente entre vos clients, quel que soit le système d'exploitation.

Pour intégrer PubNub dans le projet, installez le paquetage PubNub avec pip dans le terminal ; cela vous permettra d'utiliser le [PubNub Python SDK](https://www.pubnub.com/docs/sdks/python) et de communiquer avec l'infrastructure PubNub.

```js
pip3 install 'pubnub>=7.1.0'
```

Vous devrez créer deux clients pour vous connecter et communiquer sur le réseau PubNub. Créez un fichier pn\_client\_1.py et ajoutez le code suivant :

```js
from pubnub.callbacks import SubscribeCallback
from pubnub.enums import PNStatusCategory
from pubnub.pnconfiguration import PNConfiguration
from pubnub.pubnub import PubNub
import time
import os
pnconfig = PNConfiguration()
userId = os.path.basename(__file__)
pnconfig.publish_key = 'demo'
pnconfig.subscribe_key = 'demo'
pnconfig.user_id = userId
pnconfig.ssl = True
pubnub = PubNub(pnconfig)
def my_publish_callback(envelope, status):
  # Check whether request successfully completed or not
  if not status.is_error():
    pass
class MySubscribeCallback(SubscribeCallback):
  def presence(self, pubnub, presence):
    pass
  def status(self, pubnub, status):
    pass
  def message(self, pubnub, message):
    if message.publisher == userId : return
    print ("from device " + message.publisher + ": " + message.message)
pubnub.add_listener(MySubscribeCallback())
pubnub.subscribe().channels("chan-1").execute()
## publish a message
while True:
  msg = input("")
  if msg == 'exit': os._exit(1)
  pubnub.publish().channel("chan-1").message(str(msg)).pn_async(my_publish_callback)
```

Créez le fichier pn\_client\_2.py et ajoutez le même code que celui que vous avez utilisé pour pn\_client\_1.py

Le code ci-dessus utilise des clés 'demo', mais vous pouvez obtenir vos clés personnalisées de [PubNub personnalisées](https://admin.pubnub.com/#/register) gratuitement.

Exécutez pn\_client\_1.py et pn\_client\_2.py simultanément dans deux fenêtres de terminal différentes.

```js
python3 pn_client_1.py
```

```js
python3 pn_client_2.py
```

Chaque client initialise sa connexion au réseau PubNub et s'abonne pour recevoir de nouveaux messages chaque fois qu'ils sont publiés sur le canal 'chan-1'. En arrière-plan, PubNub crée et gère le socket pour vous et achemine votre message à tous les clients qui l'écoutent. Une fois que le client distant a reçu le message, celui-ci est affiché sur la ligne de commande.

![](https://images.ctfassets.net/3prze68gbwl1/7BRsG0oVaACcE34x7eC0yC/475d6a894f0bc535bc70d213a9e8c189/python_pubnub.png)

Et c'est tout ce qu'il y a à faire !

Quelle est l'alternative aux sockets en Python ?
------------------------------------------------

Pour plus d'informations sur le développement avec PubNub, consultez leur gamme de [tutoriels](https://www.pubnub.com/tutorials/) et [démos](https://www.pubnub.com/demos/)Vous pouvez également consulter la [visite interactive de PubNub](https://www.pubnub.com/tour/introduction/) pour comprendre comment la plateforme offre une interactivité en temps réel aux applications. PubNub prend en charge les communications par datagramme TCP et UDP, ainsi que Linux, Unix et Windows.

Nous disposons d'une vaste collection de ressources sur la messagerie en temps réel, y compris des articles et des guides rédigés par des experts sur les Websockets. Voici quelques liens utiles à explorer.

-   [Qu'est-ce que les Websockets ?](https://www.pubnub.com/guides/what-are-websockets-and-when-should-you-use-them/)
    
-   [Ressources PubNub](https://www.pubnub.com/resources)
    
-   [Blog PubNub](https://www.pubnub.com/blog/)
    

Comment PubNub peut-il vous aider ?
===================================

Cet article a été publié à l'origine sur [PubNub.com](https://pubnub.com/blog/socket-programming-in-python-client-server-p2p/)

Notre plateforme aide les développeurs à construire, fournir et gérer l'interactivité en temps réel pour les applications web, les applications mobiles et les appareils IoT.

La base de notre plateforme est le réseau de messagerie en temps réel le plus grand et le plus évolutif de l'industrie. Avec plus de 15 points de présence dans le monde, 800 millions d'utilisateurs actifs mensuels et une fiabilité de 99,999 %, vous n'aurez jamais à vous soucier des pannes, des limites de concurrence ou des problèmes de latence causés par les pics de trafic.

Découvrez PubNub
----------------

Découvrez le [Live Tour](https://www.pubnub.com/tour/introduction/) pour comprendre les concepts essentiels de chaque application alimentée par PubNub en moins de 5 minutes.

S'installer
-----------

Créez un [compte PubNub](https://admin.pubnub.com/signup/) pour un accès immédiat et gratuit aux clés PubNub.

Commencer
---------

La [documentation PubNub](https://www.pubnub.com/docs) vous permettra de démarrer, quel que soit votre cas d'utilisation ou votre [SDK](https://www.pubnub.com/docs).