Heim > Artikel > Backend-Entwicklung > Verwenden Sie das SocketServer-Framework von Python, um Netzwerkdienstprogramme zu schreiben
1. Vorwort:
Obwohl es praktisch ist, einfache Netzwerkprogramme in Python zu schreiben, ist es besser, vorgefertigte Frameworks für komplexere Netzwerkprogramme zu verwenden. Dadurch können Sie sich auf die Transaktionslogik konzentrieren und nicht auf die verschiedenen Details des Sockets. Das SocketServer-Modul vereinfacht das Schreiben von Netzwerkdienstprogrammen. Gleichzeitig ist das SocketServer-Modul auch die Basis für viele Server-Frameworks in der Python-Standardbibliothek.
2. Netzwerkdienstklasse:
SocketServer bietet 4 grundlegende Dienstklassen:
TCPServer für TCP-Socket-Stream
UDPServer für UDP-Datagram-Socket
UnixStreamServer und UnixDatagramServer sind für UNIX-Domänen-Sockets und werden nicht häufig verwendet.
Ihre Vererbungsbeziehung ist wie folgt:
------------
| BaseServer |
---- - -------
|
v
----------- -------- --- ---
|. TCPServer |------->| UnixStreamServer |
----------- ------- --------
|
v
----------- ------- ---- --------
|. UDPServer |------->| UnixDatagramServer |
----------- - ---- ---------------
2.1 Asynchrone Verarbeitung:
Diese vier Serviceklassen verarbeiten Anfragen alle synchron. Die nächste Anfrage kann erst bearbeitet werden, wenn eine Anfrage bearbeitet wurde. Um das asynchrone Modell zu unterstützen, können Sie Mehrfachvererbung verwenden, um die Serverklasse die Mischklassen ForkingMixIn oder ThreadingMixIn erben zu lassen.
ForkingMixIn nutzt Multiprozesse (Forking), um eine asynchrone Implementierung zu erreichen.
ThreadingMixIn verwendet Multithreading, um eine asynchrone Implementierung zu erreichen.
3. Anforderungsverarbeitungsklasse:
Um einen Dienst zu implementieren, müssen Sie auch eine Handler-Klasse für die Anforderungsverarbeitung ableiten und die handle()-Methode der übergeordneten Klasse überschreiben. Die Handle-Methode wird speziell zur Bearbeitung von Anfragen verwendet. Dieses Modul verarbeitet Anfragen über eine Kombination aus Serviceklassen und Anfrageverarbeitungsklassen.
Zu den vom SocketServer-Modul bereitgestellten Anforderungsverarbeitungsklassen gehören BaseRequestHandler und seine abgeleiteten Klassen StreamRequestHandler und DatagramRequestHandler. Wie aus dem Namen hervorgeht, kann einer mit Streaming-Sockets und der andere mit Datagramm-Sockets umgehen.
4. Fassen Sie die Schritte zum Erstellen eines Dienstes mit SocketServer zusammen:
1. Erstellen Sie eine Anforderungshandlerklasse (Anforderungsverarbeitungsklasse), erben Sie von der BaseRequestHandler-Klasse und überschreiben Sie deren handle()-Methode Die Methode verarbeitet die Anfrage.
2. Instanziieren Sie ein Serverklassenobjekt und übergeben Sie ihm die Adresse des Dienstes und die zuvor erstellte Anforderungshandlerklasse.
3. Rufen Sie die Methode handle_request() oder Serve_forever() des Serverklassenobjekts auf, um mit der Verarbeitung der Anfrage zu beginnen.
Ein Serverbeispiel basierend auf SocketServer:
from SocketServer import TCPServer,StreamRequestHandler #定义请求处理类 class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print 'Got connection from ',addr self.wfile.write('Thank you for connecting') server = TCPServer(('',1234), handler)#实例化服务类对象 server.server_forever()#开启服务
5. Asynchron implementieren und mehrere Verbindungen unterstützen
Wie bereits bei der Einführung der Serviceklasse erwähnt, gibt es vier grundlegende Dienste Klassen sind standardmäßig synchronisierte Modelle. Um Asynchronität zu unterstützen, können Sie Mehrfachvererbung verwenden, um von den ForkingMixIn- oder ThreadingMixInmix-in-Klassen und einer Basisdienstklasse zu erben, um eine Dienstklasse zu definieren, die Asynchronität unterstützt. Zum Beispiel:
class Server(ThreadingMixIn, TCPServer): pass
ForkingMixIn Die Kommunikation zwischen Prozessen sollte berücksichtigt werden. ThreadingMixIn sollte Synchronisierung und gegenseitigen Ausschluss berücksichtigen, wenn Threads auf dieselbe Variable zugreifen.
Ein Serverbeispiel mit Multithreading:
from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler #定义支持多线程的服务类,注意是多继承 class Server(ThreadingMixIn, TCPServer): pass #定义请求处理类 class Handler(StreamRequestHandler): def handle(self): addr = self.request.getpeername() print 'Got connection from ',addr self.wfile.write('Thank you for connection') server = Server(('', 1234), Handler)#实例化服务类 server.serve_forever()#开启服务