该模块是一个简单的网络服务器模块。它由四个基本的服务器类组成:TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer。这四个类都是同步请求,只有一个请求完全处理完成后,下一个请求才会被处理,这样的模式不适合每个请求要花费很长时间的情况。该方法为每个请求生成单独的进程或者线程,ForkingMixIn和ThreadingMixIn类可以提供异步的处理框架。
创建一个服务请求需要几步:
1 先创建一个请求句柄,可以使用BaseRequestHandler类来创建,然后重写该类的handle()方法。这个方法会处理进来的请求
2 实例化一个服务器类,绑定服务器的地址
3 调用handle_request()或者serve_forever()方法处理一个或者多个请求。
下面表示几个类的继承关系
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
class SocketServer.BaseServer
该类是所有server类的超类,他定义了接口,但是没有定义方法的实现,方法可以在子类中实现。
BaseServer.fileno()
返回一个整数的文件描述符,表示那个服务器在监听,一般和select.select()配合使用,允许在一个进程中监视多个servers
BaseServer.handle_request()
处理单个请求,这个调用以下方法: get_request(), verify_request(),process_request()
BaseServer.serve_forever(poll_interval=0.5)
请求句柄直到收到一个明确的shutdown()请求。他会忽略self.timeout
BaseServer.shutdown()
告诉 serve_forever()停止循环
BaseServer.address_family
服务的socket属于哪个协议族
BaseServer.RequestHandlerClass
用户提供一个请求句柄,
BaseServer.server_address
服务监听在那个地址
BaseServer.socket
在socket对象上,服务监听进来的请求
BaseServer.allow_reuse_address
是否允许重用地址,默认False
BaseServer.request_queue_size
请求队列大小,默认是5
BaseServer.socket_type
socket类型
BaseServer.timeout
超时时间,默认以秒为单位,None表示没有设置
可以被子类重写的方法:
BaseServer.finish_request()
BaseServer.get_request()
BaseServer.handle_error(request, client_address)
BaseServer.handle_timeout()
BaseServer.process_request(request, client_address)
BaseServer.server_activate()
BaseServer.server_bind()
BaseServer.verify_request(request, client_address)
RequestHandler.finish()
RequestHandler.handle()
RequestHandler.setup()