


Tutorial zum Schreiben grundlegender Serverprogramme in Python mithilfe des SocketServer-Moduls
SocketServer vereinfacht das Schreiben von Netzwerkservern. Es gibt 4 Klassen: TCPServer, UDPServer, UnixStreamServer, UnixDatagramServer. Diese vier Klassen werden synchron verarbeitet und die asynchrone Verarbeitung wird durch die Klassen ForkingMixIn und ThreadingMixIn unterstützt.
Schritte zum Erstellen eines Servers. Zunächst müssen Sie eine Anforderungsverarbeitungsklasse erstellen, die BaseRequestHandler unterordnet und dessen handle()-Methode überschreibt. Zweitens müssen Sie eine Serverklasse instanziieren und dabei die Adresse des Servers und die Anforderungshandlerklasse übergeben. Rufen Sie abschließend handle_request() auf (normalerweise werden andere Ereignisschleifen aufgerufen oder select() verwendet) oder dienen_forever().
Bei der Integration der ThreadingMixIn-Klasse muss das Schließen von Ausnahmen behandelt werden. daemon_threads gibt an, ob der Server auf die Beendigung des Threads warten möchte. Wenn die Threads unabhängig voneinander sind, muss der Wert auf „True“ gesetzt werden.
Unabhängig davon, welches Netzwerkprotokoll verwendet wird, verfügt die Serverklasse über dieselben externen Methoden und Eigenschaften.
In Python3 ist dieses Modul das Socketserver-Modul. In Python 2 ist dieses Modul das SocketServer-Modul. Daher müssen Sie beim Importieren mit Import den Import entsprechend der Situation durchführen, andernfalls wird ein Fehler gemeldet. Der importierte Code lautet wie folgt:
try: import socketserver #Python 3 except ImportError: import SocketServer #Python 2
Das SocketSerror-Modul enthält viele Klassen, die die Implementierung von TCP-, UDP- und UNIX-Domänen-Socket-Servern vereinfachen.
1. Verarbeitungsvorgang
Um dieses Modul zu verwenden, müssen Sie eine Handlerklasse definieren, die von der Basisklasse BaseRequestHandler erbt. Instanz h der BaseRequestHandler-Klasse kann die folgenden Methoden implementieren:
1. h.handle() Rufen Sie diese Methode auf, um die eigentliche Anforderungsoperation auszuführen. Diese Funktion kann ohne Parameter aufgerufen werden, mehrere Instanzvariablen enthalten jedoch nützliche Werte. h.request enthält die Anfrage, h.client_address enthält die Clientadresse und h.server enthält die Instanz, die den Handler aufgerufen hat. Bei Daten-Streaming-Diensten wie TCP ist das h.request-Attribut das Socket-Objekt. Bei Datagrammdiensten handelt es sich um eine Bytefolge, die die empfangenen Daten enthält.
2. h.setup() Diese Methode wird vor handle() aufgerufen. Standardmäßig passiert nichts. Wenn Sie möchten, dass der Server weitere Verbindungseinstellungen vornimmt (z. B. den Aufbau einer SSL-Verbindung), können Sie dies hier tun.
3. h.finish() Rufen Sie diese Methode auf, um den Bereinigungsvorgang nach der Ausführung von handle() durchzuführen. Standardmäßig passiert nichts. Wenn weder die Methoden setup() noch handle() eine Ausnahme erzeugen, besteht keine Notwendigkeit, diese Methode aufzurufen.
Wenn Sie wissen, dass Ihre Anwendung nur Stream-orientierte Verbindungen (z. B. TCP) manipulieren kann, sollten Sie von StreamRequestHandler anstelle von BaseRequestHandler erben. Die StreamRequestHandler-Klasse legt zwei Attribute fest. h.wfile ist ein dateiähnliches Objekt, das Daten auf den Client schreibt, und h.rfile ist ein dateiähnliches Objekt, das Daten vom Client liest.
Wenn Sie einen Handler schreiben möchten, der Pakete bearbeitet und die Antwort kontinuierlich an den Absender zurückgibt, sollte er von DatagramRequestHandler erben. Die bereitgestellte Klassenschnittstelle ist dieselbe wie StramRequestHandler.
2. Server
Um einen Handler zu verwenden, muss dieser in das Serverobjekt eingefügt werden. Es sind vier grundlegende Serverklassen definiert.
(1) TCPServer(Adresse,Handler) unterstützt den Server, der das TCP-Protokoll von IPv4 verwendet. Adresse ist ein (Host, Port)-Tupel. Handler ist eine Instanz einer Unterklasse der BaseRequestHandler- oder StreamRequestHandler-Klasse.
(2) UDPServer(address,handler) unterstützt den Server, der das UDP-Protokoll von IPv4 verwendet. Die Adresse und der Handler ähneln denen in TCPServer.
(3) UnixStreamServer (Adresse, Handler) verwendet UNIX-Domänen-Sockets, um einen datenstromprotokollorientierten Server zu implementieren, der von TCPServer geerbt wird.
(4) UnixDatagramServer(address,handler) Ein Server, der UNIX-Domänensockets verwendet, um das von UDPServer geerbte Datagrammprotokoll zu implementieren.
Instanzen aller vier Serverklassen verfügen über die folgenden Methoden und Variablen:
1. s.socket Das Socket-Objekt, das für eingehende Anfragen verwendet wird.
2. s.sever_address Die Adresse des lauschenden Servers. Zum Beispiel Tupel ("127.0.0.1",80)
3. s.RequestHandlerClass Die Anforderungshandlerklasse, die an den Serverkonstruktor übergeben und vom Benutzer bereitgestellt wird.
4. s.serve_forever() verarbeitet unbegrenzte Anfragen
5. s.shutdown() Stoppen Sie die Serve_forever()-Schleife
6. s.fileno() Gibt den ganzzahligen Dateideskriptor des Server-Sockets zurück. Diese Methode nutzt Serverinstanzen effektiv durch Abfragevorgänge wie die Funktion select().
三、定义自定义服务器
服务器往往需要特殊的配置来处理不同的网络地址族、超时期、并发和其他功能,可以通过继承上面四个基本服务器类来自行定义。
可以通过混合类获得更多服务器功能,这也是通过进程或线程分支添加并发行的方法。为了实现并发性,定义了以下类:
(1)ForkingMixIn 将UNIX进程分支添加到服务器的混合方法,使用该方法可以让服务器服务多个客户。
(2)ThreadingMixIn 修改服务器的混合类,可以使用线程服务多个客户端。
要向服务器添加这些功能,可以使用多重继承,其中首先列出混了类。
由于并发服务器很常用,为了定义它,SocketServer预定义了以下服务器类:
(1)ForkingUDPServer(address,handler)
(2)ForkingTCPServer(address,handler)
(3)ThreadingUDPServer(address,handler)
(4)ThreadingTCPServer(address,handler)
上面有点乱,现总结以下:
SocketServer模块中的类主要有以下几个:
1、BaseServer 包含服务器的核心功能与混合类(mix-in)的钩子功能。这个类主要用于派生,不要直接生成这个类的类对象,可以考虑使用TCPServer和UDPServer类。
2、TCPServer 基本的网络同步TCP服务器
3、UDPServer 基本的网络同步UDP服务器
4、ForkingMixIn 实现了核心的进程化功能,用于与服务器类进行混合(mix-in),以提供一些异步特性。不要直接生成这个类的对象。
5、ThreadingMixIn 实现了核心的线程化功能,用于与服务器类进行混合(mix-in),以提供一些异步特性。不要直接生成这个类的对象。
6、ForkingTCPServer ForkingMixIn与TCPServer的组合
7、ForkingUDPServer ForkingMixIn与UDPServer的组合
8、BaseRequestHandler
9、StreamRequestHandler TCP请求处理类的一个实现
10、DataStreamRequestHandler UDP请求处理类的一个实现
现在繁杂的事务都已经封装到类中了,直接使用类即可。
四、实例
1.使用SocketServer模块编写的TCP服务器端代码:
#! /usr/bin/env python #coding=utf-8 """使用SocketServer来实现简单的TCP服务器""" from SocketServer import (TCPServer,StreamRequestHandler as SRH) from time import ctime class MyRequestHandler(SRH): def handle(self): print "connected from ",self.client_address self.wfile.write("[%s] %s" %(ctime(),self.rfile.readline())) tcpSer=TCPServer(("",10001),MyRequestHandler) print "waiting for connection" tcpSer.serve_forever() 相应的TCP客户端代码: #! /usr/bin/env python #coding=utf-8 from socket import * BUFSIZE=1024 #每次都要创建新的连接 while True: tcpClient=socket(AF_INET,SOCK_STREAM) tcpClient.connect(("localhost",10001)) data=raw_input(">") if not data: break tcpClient.send("%s\r\n" %data) data1=tcpClient.recv(BUFSIZE) if not data1: break print data1.strip() tcpClient.close()
2.异步服务器的实现
ThreadingMixIn的例子:
import socketimport threadingimport SocketServerclass ThreadedTCPRequestHandler(SocketServer.BaseRequestHandler): def handle(self): data = self.request.recv(1024) cur_thread = threading.current_thread() response = "{}: {}".format(cur_thread.name, data) self.request.sendall(response)class ThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer): passdef client(ip, port, message): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((ip, port)) try: sock.sendall(message) response = sock.recv(1024) print "Received: {}".format(response) finally: sock.close()if __name__ == "__main__": # Port 0 means to select an arbitrary unused port HOST, PORT = "localhost", 0 server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler) ip, port = server.server_address # Start a thread with the server -- that thread will then start one # more thread for each request server_thread = threading.Thread(target=server.serve_forever) # Exit the server thread when the main thread terminates server_thread.daemon = True server_thread.start() print "Server loop running in thread:", server_thread.name client(ip, port, "Hello World 1") client(ip, port, "Hello World 2") client(ip, port, "Hello World 3") server.shutdown()
执行结果:
$ python ThreadedTCPServer.py Server loop running in thread: Thread-1 Received: Thread-2: Hello World 1 Received: Thread-3: Hello World 2 Received: Thread-4: Hello World 3

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



PHP ist hauptsächlich prozedurale Programmierung, unterstützt aber auch die objektorientierte Programmierung (OOP). Python unterstützt eine Vielzahl von Paradigmen, einschließlich OOP, funktionaler und prozeduraler Programmierung. PHP ist für die Webentwicklung geeignet, und Python eignet sich für eine Vielzahl von Anwendungen wie Datenanalyse und maschinelles Lernen.

PHP eignet sich für Webentwicklung und schnelles Prototyping, und Python eignet sich für Datenwissenschaft und maschinelles Lernen. 1.PHP wird für die dynamische Webentwicklung verwendet, mit einfacher Syntax und für schnelle Entwicklung geeignet. 2. Python hat eine kurze Syntax, ist für mehrere Felder geeignet und ein starkes Bibliotheksökosystem.

VS -Code kann zum Schreiben von Python verwendet werden und bietet viele Funktionen, die es zu einem idealen Werkzeug für die Entwicklung von Python -Anwendungen machen. Sie ermöglichen es Benutzern: Installation von Python -Erweiterungen, um Funktionen wie Code -Abschluss, Syntax -Hervorhebung und Debugging zu erhalten. Verwenden Sie den Debugger, um Code Schritt für Schritt zu verfolgen, Fehler zu finden und zu beheben. Integrieren Sie Git für die Versionskontrolle. Verwenden Sie Tools für die Codeformatierung, um die Codekonsistenz aufrechtzuerhalten. Verwenden Sie das Lining -Tool, um potenzielle Probleme im Voraus zu erkennen.

VS -Code kann unter Windows 8 ausgeführt werden, aber die Erfahrung ist möglicherweise nicht großartig. Stellen Sie zunächst sicher, dass das System auf den neuesten Patch aktualisiert wurde, und laden Sie dann das VS -Code -Installationspaket herunter, das der Systemarchitektur entspricht und sie wie aufgefordert installiert. Beachten Sie nach der Installation, dass einige Erweiterungen möglicherweise mit Windows 8 nicht kompatibel sind und nach alternativen Erweiterungen suchen oder neuere Windows -Systeme in einer virtuellen Maschine verwenden müssen. Installieren Sie die erforderlichen Erweiterungen, um zu überprüfen, ob sie ordnungsgemäß funktionieren. Obwohl VS -Code unter Windows 8 möglich ist, wird empfohlen, auf ein neueres Windows -System zu upgraden, um eine bessere Entwicklungserfahrung und Sicherheit zu erzielen.

VS -Code -Erweiterungen stellen böswillige Risiken dar, wie das Verstecken von böswilligem Code, das Ausbeutetieren von Schwachstellen und das Masturbieren als legitime Erweiterungen. Zu den Methoden zur Identifizierung böswilliger Erweiterungen gehören: Überprüfung von Verlegern, Lesen von Kommentaren, Überprüfung von Code und Installation mit Vorsicht. Zu den Sicherheitsmaßnahmen gehören auch: Sicherheitsbewusstsein, gute Gewohnheiten, regelmäßige Updates und Antivirensoftware.

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

PHP entstand 1994 und wurde von Rasmuslerdorf entwickelt. Es wurde ursprünglich verwendet, um Website-Besucher zu verfolgen und sich nach und nach zu einer serverseitigen Skriptsprache entwickelt und in der Webentwicklung häufig verwendet. Python wurde Ende der 1980er Jahre von Guidovan Rossum entwickelt und erstmals 1991 veröffentlicht. Es betont die Lesbarkeit und Einfachheit der Code und ist für wissenschaftliche Computer, Datenanalysen und andere Bereiche geeignet.

Im VS -Code können Sie das Programm im Terminal in den folgenden Schritten ausführen: Erstellen Sie den Code und öffnen Sie das integrierte Terminal, um sicherzustellen, dass das Codeverzeichnis mit dem Terminal Working -Verzeichnis übereinstimmt. Wählen Sie den Befehl aus, den Befehl ausführen, gemäß der Programmiersprache (z. B. Pythons Python your_file_name.py), um zu überprüfen, ob er erfolgreich ausgeführt wird, und Fehler auflösen. Verwenden Sie den Debugger, um die Debugging -Effizienz zu verbessern.
