Maison > développement back-end > Tutoriel Python > Salle de discussion TCP en Python

Salle de discussion TCP en Python

Linda Hamilton
Libérer: 2025-01-04 19:16:40
original
882 Les gens l'ont consulté

TCP Chatroom in Python

Introduction

Dans ce blog, nous allons implémenter un salon de discussion TCP entièrement fonctionnel en utilisant Python. Nous aurons un serveur qui héberge la salle et plusieurs clients qui s'y connectent et communiquent entre eux.

À propos de l'architecture TCP et client-serveur

Transmission Control Protocol est un protocole de communication orienté connexion qui facilite l'échange de messages entre différents appareils sur un réseau.

Pour la mise en œuvre de notre salon de discussion, nous utiliserons l'architecture client-serveur. Cela signifie que nous aurons plusieurs clients (les utilisateurs) et un serveur central qui héberge tout et fournit les données de ces clients.


Configuration du serveur ( server.py )

1. Pour configurer notre serveur de base, nous devrons importer deux bibliothèques, à savoir socket et threading. La bibliothèque de sockets sera utilisée pour établir et configurer la ou les connexion(s) réseau et la bibliothèque de threads est nécessaire pour effectuer diverses tâches en même temps.

import socket
import threading
Copier après la connexion
Copier après la connexion
Copier après la connexion

2. La tâche suivante consiste à définir les données de notre serveur et à initialiser notre socket. Nous aurons besoin d'une adresse IP pour l'hôte et d'un numéro de port libre pour notre serveur. Dans ce blog, nous utiliserons l'adresse 127.0.0.1 c'est à dire notre localhost et le port 5500.

Le numéro de port n'a pas d'importance mais vous devez vous assurer que le port que vous utilisez est libre et non réservé. Si vous exécutez cette salle de discussion sur un serveur réel ou une machine virtuelle, spécifiez l'adresse IP du serveur de salle de discussion comme adresse IP de l'hôte de la machine virtuelle ou du serveur.

Consultez cette liste de numéros de ports réservés pour plus d'informations.

# Server Data
host = '127.0.0.1'
port = 5500
Copier après la connexion
Copier après la connexion
Copier après la connexion

3. Lorsque nous définissons notre socket, nous devons passer deux paramètres. Ceux-ci définissent le type de socket que nous souhaitons utiliser. Le premier (AF_INET) indique que nous utilisons une socket internet plutôt qu’une socket unix. Le deuxième paramètre représente le protocole que nous souhaitons utiliser. SOCK_STREAM indique que nous utilisons TCP.

Après avoir défini le socket, nous le lions ou l'attachons à notre hôte et au port spécifié en passant un tuple qui contient les deux valeurs. Nous mettrons ensuite notre serveur en mode écoute, afin qu'il attende que les clients se connectent et envoient des messages..

# Start the Server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()
Copier après la connexion
Copier après la connexion
Copier après la connexion

4. Nous créerons également deux listes vides, que nous utiliserons pour stocker les clients connectés et leurs pseudos plus tard.

import socket
import threading
Copier après la connexion
Copier après la connexion
Copier après la connexion

5. Nous allons maintenant définir toutes les fonctions qui vont nous aider à diffuser des messages. Il enverra un message à chaque client connecté et donc présent dans la liste des clients.

# Server Data
host = '127.0.0.1'
port = 5500
Copier après la connexion
Copier après la connexion
Copier après la connexion

6. Nous allons maintenant créer une fonction handle(). Cette fonction sera responsable du traitement des messages des clients. Cette fonction s'exécutera dans une boucle while. La fonction acceptera un client comme paramètre et le gérera dans une boucle sans fin jusqu'à ce qu'une erreur se produise ou que le client lui-même se déconnecte.

# Start the Server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()
Copier après la connexion
Copier après la connexion
Copier après la connexion

7. Il faut maintenant recevoir le message du client et le diffuser à tous les clients connectés. Ainsi, lorsqu'un client envoie un message, tous les autres peuvent voir ce message via la fonction Broadcast(). Maintenant, si pour une raison quelconque il y a une erreur avec la connexion à ce client, nous le supprimons ainsi que son pseudo, fermons la connexion et diffusons que ce client a quitté le chat.

# Lists For Clients and Their Nicknames
clients = []
nicknames = []
Copier après la connexion
Copier après la connexion

Lorsque nous serons prêts à exécuter notre serveur, nous exécuterons cette fonction de réception. Une fois qu'un client est connecté au serveur, il lui enverra la chaîne « NOM », qui indiquera au client que son surnom est demandé. Après cela, il attend une réponse et ajoute le client avec le surnom respectif aux listes et démarre un thread pour la fonction handle() pour ce client particulier.

8. Maintenant, nous pouvons simplement exécuter cette fonction et notre serveur est terminé.

# Sending Messages To All Connected Clients
def broadcast(message):
    for client in clients:
        client.send(message)
Copier après la connexion

Configuration du client ( client.py )

Maintenant, nous allons implémenter notre client. Pour cela, nous devrons à nouveau importer les mêmes bibliothèques.

# Handling Clients
def handle(client):
    while True:
        try:
            # Broadcasting Messages
            message = client.recv(1024)
            broadcast(message)
        except:
            # Removing And Closing Clients
            index = clients.index(client)
            clients.remove(client)
            client.close()
            nickname = nicknames[index]
            broadcast('{} left!'.format(nickname).encode('ascii'))
            nicknames.remove(nickname)
            break
Copier après la connexion

1. Les premières étapes du client sont de choisir un pseudo et de se connecter à notre serveur. Nous aurons besoin de connaître l'adresse exacte et le port sur lequel notre serveur fonctionne. Au lieu de lier les données et d'écouter, en tant que client, nous nous connectons à un serveur existant.

# Receiving `Function
def receive():
    while True:
        # Accept Connection
        client, address = server.accept()
        print("Connected with {}".format(str(address)))

        # Request And Store Nickname
        client.send('NAME'.encode('ascii'))
        nickname = client.recv(1024).decode('ascii')
        nicknames.append(nickname)
        clients.append(client)

        # Print And Broadcast Nickname
        print("Nickname is {}".format(nickname))
        broadcast("{} joined!".format(nickname).encode('ascii'))
        client.send('Connected to server!'.encode('ascii'))

        # Start Handling Thread For Client
        thread = threading.Thread(target=handle, args=(client,))
        thread.start()
Copier après la connexion

2. Désormais, un client doit avoir deux threads qui s'exécutent en même temps. Le premier recevra en permanence des données du serveur et le second enverra nos propres messages au serveur.

receive()
Copier après la connexion

Encore une fois, nous avons ici une boucle while sans fin. Il essaie constamment de recevoir des messages et de les imprimer à l'écran. Si le message est 'NOM', il ne l'imprime pas mais envoie son pseudo au serveur.

La fonction d'écriture est assez courte. Il fonctionne également dans une boucle sans fin qui attend toujours une entrée de l'utilisateur. Une fois qu'il en a récupéré, il le combine avec le pseudo et l'envoie au serveur.

3. La dernière chose que nous devons faire est de démarrer deux threads qui exécutent ces deux fonctions.

import socket
import threading
Copier après la connexion
Copier après la connexion
Copier après la connexion

Et maintenant, nous avons terminé. Nous disposons d'un serveur entièrement fonctionnel et de clients fonctionnels qui peuvent s'y connecter et communiquer entre eux.


Gérer le salon de discussion

C'est parti pour un essai. Gardez simplement à l’esprit que nous devons toujours démarrer le serveur en premier, sinon les clients ne pourront pas se connecter à un hôte inexistant.

*Journal du serveur : *

# Server Data
host = '127.0.0.1'
port = 5500
Copier après la connexion
Copier après la connexion
Copier après la connexion

*Journal du client un : *

# Start the Server
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()
Copier après la connexion
Copier après la connexion
Copier après la connexion

*Journal du client deux : *

# Lists For Clients and Their Nicknames
clients = []
nicknames = []
Copier après la connexion
Copier après la connexion

Et nous avons créé avec succès un salon de discussion basé sur le protocole de contrôle de transmission en Python ! ? ?

Trouvez le code complet ici :https://github.com/rajatuiwebdev/tcp-chatroom-in-python
Suivez-moi sur Instagram : https://instagram.com/rajatrajput.dev
Suivez-moi sur LinkedIn : https://linkedin.com/in/rajatrajput2004

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal