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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FuncPlotCalc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值