


projet de didacticiel de base python cinq goûter virtuel
Cet article présente principalement en détail le tea party virtuel du projet de didacticiel de base Python 5. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer
Apprendre et utiliser presque n'importe quel type de langage de programmation When. , les exercices sur les sockets ne manquent jamais, en particulier lorsqu'il s'agit d'écrire sur la communication sur les réseaux locaux. Ce projet du livre est donc idéal pour pratiquer la programmation socket.
L'idée générale de cet exercice est d'avoir dans un premier temps un serveur de chat. Les principales fonctions de ce serveur sont de fournir des connexions socket client, stocker la session de connexion de chaque client, traiter les messages envoyés par chaque connexion. et analysez les données envoyées par le client. C'est tout. Quant au client, vous n'avez pas besoin d'écrire de code, utilisez simplement l'outil telnet du système.
Je pense qu'avec l'analyse ci-dessus, il n'y a pas grand chose à dire sur le reste de ce programme, sauf bien sûr, à l'exception des deux classes qui encapsulent les sockets.
J'ai essayé cela en utilisant la classe socket en python et j'ai écrit un programme de communication simple. Cependant, pour une raison quelconque, des accidents se produisaient toujours pendant la communication. Ce code simple est le suivant :
server.py
import socket mysocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) mysocket.bind(('',8888)) mysocket.listen(5) while True: connection,addr = mysocket.accept() revStr = connection.recv(1024) connection.send('Server:' + revStr) connection.close()
clinet.py
import socket import time clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) clientsocket.connect(('',8888)) while True: time.sleep(2) clientsocket.send('hello the5fire') print clientsocket.recv(1024) clientsocket.close()
La raison pour laquelle ce programme a mal tourné n'est pas expliquée en détail, car python fournit deux classes encapsulées pour compléter le processus de communication du socket : async_chat dans asyncchat et dispatcher dans asyncore Ainsi que asyncore lui-même. La première classe est utilisée pour gérer chaque session entre le client et le serveur, et la seconde classe est principalement utilisée pour fournir des services de connexion socket. Et chaque connexion socket est hébergée par la première (async_chat) pour le traitement.
Regardez le code :
from asyncore import dispatcher from asynchat import async_chat import socket, asyncore PORT = 5005 NAME = 'TestChat' class EndSession(Exception):pass class CommandHandler: def unknown(self, session, cmd): session.push('Unknown command: %s\r\n' % cmd) def handle(self, session, line): if not line.strip(): return parts = line.split(' ',1) cmd = parts[0] try: line = parts[1].strip() except IndexError: line = '' meth = getattr(self, 'do_'+cmd, None) try: meth(session, line) except TypeError: self.unknown(session,cmd) class Room(CommandHandler): def __init__(self, server): self.server = server self.sessions = [] def add(self, session): self.sessions.append(session) def remove(self, session): self.sessions.remove(session) def broadcast(self, line): for session in self.sessions: session.push(line) def do_logout(self, session, line): raise EndSession class LoginRoom(Room): def add(self,session): Room.add(self,session) self.broadcast('Welcome to %s\r\n' % self.server.name) def unknown(self, session, cmd): session.push('Please log in \nUse "login"\r\n') def do_login(self, session, line): name = line.strip() if not name: session.push('Please enter a name\r\n') elif name in self.server.users: session.push('The name "%s" is taken.\r\n' % name) sessoin.push('Please try again.\r\n') else: session.name = name session.enter(self.server.main_room) class ChatRoom(Room): def add(self, session): self.broadcast(session.name + ' has entered the room.\r\n') self.server.users[session.name] = session Room.add(self, session) def remove(self, session): Room.remove(self, session) self.broadcast(session.name + ' has left the room.\r\n') def do_say(self, session, line): self.broadcast(session.name + ': ' + line + '\r\n') def do_look(self, session, line): session.push('The following are in this room:\r\n') for other in self.sessions: session.push(other.name + '\r\n') def do_who(self, session, line): session.push('The following are logged in:\r\n') for name in self.server.users: session.push(name + '\r\n') class LogoutRoom(Room): def add(self, session): try: del self.server.users[session.name] except KeyError: pass class ChatSession(async_chat): def __init__(self, server, sock): async_chat.__init__(self,sock) self.server = server self.set_terminator('\r\n') self.data = [] self.name = None self.enter(LoginRoom(server)) def enter(self, room): try: cur = self.room except AttributeError: pass else: cur.remove(self) self.room = room room.add(self) def collect_incoming_data(self, data): self.data.append(data) def found_terminator(self): line = ''.join(self.data) self.data = [] try: self.room.handle(self, line) except EndSession: self.handle_close() def handle_close(self): async_chat.handle_close(self) self.enter(LogoutRoom(self.server)) class ChatServer(dispatcher): def __init__(self, port, name): dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.bind(('',port)) self.listen(5) self.name = name self.users = {} self.main_room = ChatRoom(self) def handle_accept(self): conn, addr = self.accept() ChatSession(self,conn) if __name__ == '__main__': s = ChatServer(PORT, NAME) try: asyncore.loop() except KeyboardInterrupt: print
L'ensemble du programme est divisé en trois parties comme J'ai mentionné au début Chaque partie :
Fournit la connexion socket du client : classe ChatServer.
Stockez la session de connexion de chaque client et traitez les messages envoyés par chaque connexion : Classe ChatSession La fonction de cette classe est très simple Elle accepte les données et détermine s'il y a un terminateur. , la méthode found_terminator est appelée .
Analyser les données envoyées par le client : ce sont les classes restantes liées à la salle. Ces classes sont utilisées pour traiter les chaînes et les commandes envoyées par le client, et elles sont toutes héritées de CommandHandler.
Capture d'écran finale :
Recommandations associées :
Projet de tutoriel de base Python trois-en- un XML
Projet de tutoriel de base Python 2 Bonnes images
Projet de tutoriel de base Python 4 Agrégation de nouvelles
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Solution aux problèmes d'autorisation Lors de la visualisation de la version Python dans Linux Terminal Lorsque vous essayez d'afficher la version Python dans Linux Terminal, entrez Python ...

Lorsque vous utilisez la bibliothèque Pandas de Python, comment copier des colonnes entières entre deux frames de données avec différentes structures est un problème courant. Supposons que nous ayons deux dats ...

Pourquoi mon code ne peut-il pas faire renvoyer les données par l'API? En programmation, nous rencontrons souvent le problème du retour des valeurs nulles lorsque l'API appelle, ce qui n'est pas seulement déroutant ...

Utilisation alternative des annotations des paramètres Python Dans la programmation Python, les annotations des paramètres sont une fonction très utile qui peut aider les développeurs à mieux comprendre et utiliser les fonctions ...

Comment les scripts Python effacent-ils la sortie en position de curseur à un emplacement spécifique? Lors de l'écriture de scripts Python, il est courant d'effacer la sortie précédente à la position du curseur ...

Choix de la bibliothèque de développement d'applications de bureau multiplateforme Python De nombreux développeurs Python souhaitent développer des applications de bureau pouvant s'exécuter sur Windows et Linux Systems ...

Précision avec Python: Source de sablier Dessin graphique et vérification d'entrée Cet article résoudra le problème de définition variable rencontré par un novice Python dans le programme de dessin graphique de sablier. Code...

Conversion et statistiques de données: traitement efficace des grands ensembles de données Cet article introduira en détail comment convertir une liste de données contenant des informations sur le produit en une autre contenant ...
