# [Python] Socket

## Introduction

En python, pour créer des applications en réseau il faut passer par des **sockets** qui est un objet de communication réseau qui permet d'échanger de l'information sur la couche IP.

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2023-12/scaled-1680-/4DHimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2023-12/4DHimage.png)

## Codage

#### Quelques explications

Le socket est composé :

- D'un **protocole** de communication (<span style="text-decoration: underline;">SOCK\_STREAM</span> pour TCP et <span style="text-decoration: underline;">SOCK\_DGRAM</span> pour UDP).
- D'une **adresse IP** source et destination.
- D'un **port** source et destination.
- D'un **message** à transporter.

#### Code serveur

```python
import socket

SERVER_IP = '127.0.0.1'
SERVER_PORT = 1234

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server_socket.bind((SERVER_IP, SERVER_PORT))

server_socket.listen(5)
print("Serveur en attente de connexions...")

client_socket, client_address = server_socket.accept()
print(f"Connexion entrante de {client_address}")

try:
    data = client_socket.recv(1024)
    print("Message du client :", data.decode())

    response = "Message reçu par le serveur!"
    client_socket.sendall(response.encode())

except ConnectionResetError:
    print("La connexion a été réinitialisée par le client.")

finally:
    client_socket.close()

server_socket.close()
```

#### Code client

```python
import socket

SERVER_IP = '127.0.0.1'
SERVER_PORT = 1234

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    client_socket.connect((SERVER_IP, SERVER_PORT))
    print("Connecté au serveur.")

    message = "Bonjour, serveur!"
    client_socket.sendall(message.encode())

    data = client_socket.recv(1024)
    print("Message du serveur :", data.decode())

except ConnectionRefusedError:
    print("La connexion a été refusée. Assurez-vous que le serveur est en cours d'exécution.")

finally:
    client_socket.close()

```