Explication détaillée de la programmation tordue en python
Avant-propos :
Je ne suis pas doué pour écrire du code socket. L’une est qu’il est plus difficile d’écrire en C, et l’autre est que je n’en ai généralement pas besoin. Ce n’est que lorsque j’ai vraiment voulu le comprendre que j’ai réalisé que j’avais vraiment des points à améliorer dans ce domaine. Récemment, j'ai eu besoin d'écrire du code Python pour des raisons de projet, et j'ai découvert à quel point c'était cool de développer des sockets sous python.
Pour la plupart des sockets, les utilisateurs n'ont qu'à prêter attention à trois événements. Il s’agit respectivement de créer, de supprimer, d’envoyer et de recevoir des données. La bibliothèque torsadée en python peut nous aider à atteindre un tel objectif, et elle n'est pas gênante à utiliser. Le code suivant provient du site twistedmatrix. Je pense qu'il est plutôt bien, je vais donc le poster ici pour le partager avec vous. Si vous avez besoin de tester, telnet localhost 8123. Si vous devez traiter des signaux dans twisted, vous pouvez d'abord enregistrer la fonction signal, appeler réacteur.stop() dans la fonction signal, puis twisted continuera à appeler stop_factory, afin que vous puissiez continuer à terminer le travail de nettoyage restant.
from twisted.internet.protocol import Factory from twisted.protocols.basic import LineReceiver from twisted.internet import reactor class Chat(LineReceiver): def __init__(self, users): self.users = users self.name = None self.state = "GETNAME" def connectionMade(self): self.sendLine("What's your name?") def connectionLost(self, reason): if self.name in self.users: del self.users[self.name] def lineReceived(self, line): if self.state == "GETNAME": self.handle_GETNAME(line) else: self.handle_CHAT(line) def handle_GETNAME(self, name): if name in self.users: self.sendLine("Name taken, please choose another.") return self.sendLine("Welcome, %s!" % (name,)) self.name = name self.users[name] = self self.state = "CHAT" def handle_CHAT(self, message): message = "<%s> %s" % (self.name, message) for name, protocol in self.users.iteritems(): if protocol != self: protocol.sendLine(message) class ChatFactory(Factory): def __init__(self): self.users = {} # maps user names to Chat instances def buildProtocol(self, addr): return Chat(self.users) def startFactory(self): print 'start' def stopFactory(self): print 'stop' reactor.listenTCP(8123, ChatFactory()) reactor.run()
Merci d'avoir lu, j'espère que cela pourra vous aider, merci pour votre soutien à ce site !
Pour des explications plus détaillées et des exemples simples de programmation twisted en python, veuillez faire attention au site Web PHP chinois !