python:socketserver --- 用于网络服务器的框架
该模块具有四个基础实体服务器类:
class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
该类使用互联网 TCP 协议,它可以提供客户端与服务器之间的连续数据流。 如果 bind_and_activate 为真值,该类的构造器会自动尝试发起调用 server_bind() 和 server_activate()。 其他形参会被传递给 BaseServer 基类。
class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
该类使用数据包,即一系列离散的信息分包,它们可能会无序地到达或在传输中丢失。 该类的形参与 TCPServer 的相同。
class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
class socketserver.UnixDatagramServer(server_address, RequestHandlerClass, bind_and_activate=True)
这两个更常用的类与 TCP 和 UDP 类相似,但使用 Unix 域套接字;它们在非 Unix 系统平台上不可用。 它们的形参与 TCPServer 的相同。
这四个类会 同步地 处理请求;每个请求必须完成才能开始下一个请求。 这就不适用于每个请求要耗费很长时间来完成的情况,或者因为它需要大量的计算,又或者它返回了大量的数据而客户端处理起来很缓慢。 解决方案是创建单独的进程或线程来处理每个请求;ForkingMixIn 和 ThreadingMixIn 混合类可以被用于支持异步行为。
创建一个服务器需要分几个步骤进行。 首先,你必须通过子类化 BaseRequestHandler 类并重载其 handle() 方法来创建一个请求处理句柄类;这个方法将处理传入的请求。 其次,你必须实例化某个服务器类,将服务器地址和请求处理句柄类传给它。 建议在 with 语句中使用该服务器。 然后再调用服务器对象的 handle_request() 或 serve_forever() 方法来处理一个或多个请求。 最后,调用 server_close() 来关闭套接字(除非你使用了 with 语句)。
当从 ThreadingMixIn 继承线程连接行为时,你应当显式地声明你希望在突然关机时你的线程采取何种行为。 ThreadingMixIn 类定义了一个属性 daemon_threads,它指明服务器是否应当等待线程终止。 如果你希望线程能自主行动你应当显式地设置这个旗标;默认值为 False,表示 Python 将不会在 ThreadingMixIn 所创建的所有线程都退出之前退出。
服务器类具有同样的外部方法和属性,无论它们使用哪种网络协议。
服务器创建的说明
在继承图中有五个类,其中四个代表四种类型的同步服务器:
±-----------+
| BaseServer |
±-----------+
|
v
±----------+ ±-----------------+
| TCPServer |------->| UnixStreamServer |
±----------+ ±-----------------+
|
v
±----------+ ±-------------------+
| UDPServer |------->| UnixDatagramServer |
±----------+ ±-------------------+
class socketserver.ForkingMixIn
class socketserver.ThreadingMixIn
每种服务器类型的分叉和线程版本都可以使用这些混合类来创建。 例如,ThreadingUDPServer 的创建方式如下:
class ThreadingUDPServer(ThreadingMixIn, UDPServer):
pass
混合类先出现,因为它重载了 UDPServer 中定义的一个方法。 设置各种属性也会改变下层服务器机制的行为。
ForkingMixIn 和下文提及的分叉类仅在支持 fork() 的 POSIX 系统平台上可用。
socketserver.ForkingMixIn.server_close() 会等待直到所有子进程完成,除非 socketserver.ForkingMixIn.block_on_close 属性为假值。
socketserver.ThreadingMixIn.server_close() 会等待直到所有非守护类线程完成,除非 socketserver.ThreadingMixIn.block_on_close 属性为假值。 请将 ThreadingMixIn.daemon_threads 设为 True 来使用守护类线程以便不等待线完成。
在 3.7 版更改: socketserver.ForkingMixIn.server_close() 和 socketserver.ThreadingMixIn.server_close() 现在会等待直到所有子进程和非守护类线程完成。 请新增一个 socketserver.ForkingMixIn.block_on_close 类属性来选择 3.7 版之前的行为。
class socketserver.ForkingTCPServer
class socketserver.ForkingUDPServer
class socketserver.ThreadingTCPServer
class socketser

最低0.47元/天 解锁文章
331

被折叠的 条评论
为什么被折叠?



