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.
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.
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
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
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()
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
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
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()
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 = []
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)
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
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()
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()
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
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.
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
*Journal du client un : *
# Start the Server server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((host, port)) server.listen()
*Journal du client deux : *
# Lists For Clients and Their Nicknames clients = [] nicknames = []
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!