1. 서문:
파이썬으로 간단한 네트워크 프로그램을 작성하는 것이 편리하지만, 보다 복잡한 네트워크 프로그램에는 이미 만들어진 프레임워크를 사용하는 것이 좋습니다. 이를 통해 소켓의 다양한 세부 사항보다는 트랜잭션 논리에 집중할 수 있습니다. SocketServer 모듈은 네트워크 서비스 프로그램 작성 작업을 단순화합니다. 동시에 SocketServer 모듈은 Python 표준 라이브러리에 있는 많은 서버 프레임워크의 기반이기도 합니다.
2. 네트워크 서비스 클래스:
SocketServer는 4가지 기본 서비스 클래스를 제공합니다:
TCP 소켓 스트림용 TCPServer
UDP 데이터그램 소켓용 UDPServer
UnixStreamServer 및 UnixDatagramServer는 UNIX 도메인 소켓용이므로 일반적으로 사용되지 않습니다.
상속 관계는 다음과 같습니다.
+------------+
| BaseServer |
+- - ----------+
|
v
+------------+ +---- - -------------+
| TCP서버 |------->| UnixStreamServer |
+--------- - ---+ -----+ +---------+
| UDPServer |------->| UnixDatagramServer |
+------------+ +------------+
2.1 비동기 처리:
이 네 가지 서비스 클래스는 모두 요청을 동기적으로 처리합니다. 하나의 요청이 처리될 때까지 다음 요청을 처리할 수 없습니다. 비동기 모델을 지원하려면 다중 상속을 사용하여 서버 클래스가 ForkingMixIn 또는 ThreadingMixIn 혼합 클래스를 상속하도록 할 수 있습니다.
ForkingMixIn은 다중 프로세스(포킹)를 활용하여 비동기 구현을 달성합니다.
ThreadingMixIn은 멀티스레딩을 사용하여 비동기 구현을 달성합니다.
3. 요청 처리 클래스:
서비스를 구현하려면 핸들러 클래스 요청 처리 클래스도 파생시키고 상위 클래스의 handler() 메서드를 재정의해야 합니다. 핸들 메소드는 특히 요청을 처리하는 데 사용됩니다. 이 모듈은 서비스 클래스와 요청 처리 클래스의 조합을 통해 요청을 처리합니다.
SocketServer 모듈에서 제공하는 요청 처리 클래스에는 BaseRequestHandler와 파생 클래스 StreamRequestHandler 및 DatagramRequestHandler가 포함됩니다. 이름에서 알 수 있듯이 하나는 스트리밍 소켓을 처리할 수 있고 다른 하나는 데이터그램 소켓을 처리할 수 있습니다.
4. SocketServer를 사용하여 서비스를 생성하는 단계를 요약합니다.
1. 요청 핸들러 클래스(요청 처리 클래스)를 생성하고 BaseRequestHandler 클래스에서 상속하고 해당 handler() 메서드를 재정의합니다. 메소드가 요청을 처리합니다.
2. 서버 클래스 객체를 인스턴스화하고 여기에 서비스 주소와 이전에 생성된 요청 핸들러 클래스를 전달합니다.
3. 서버 클래스 객체의 handler_request() 또는 Serve_forever() 메서드를 호출하여 요청 처리를 시작합니다.
SocketServer 기반 서버 예:
5. 비동기식 구현 및 다중 연결 지원 앞서 서비스 클래스를 소개할 때 언급했듯이 기본 서비스는 4가지가 있습니다. 클래스는 기본적으로 동기 모델입니다. 비동기성을 지원하려면 다중 상속을 사용하여 ForkingMixIn 또는 ThreadingMixInmix-in 클래스와 기본 서비스 클래스에서 상속하여 비동기성을 지원하는 서비스 클래스를 정의할 수 있습니다. 예: class Server(ThreadingMixIn, TCPServer): passfrom 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()#开启服务
ForkingMixIn 프로세스 간 통신을 고려해야 합니다. ThreadingMixIn은 스레드가 동일한 변수에 액세스할 때 동기화 및 상호 배제를 고려해야 합니다.
멀티스레딩을 사용한 서버 예: