第十一章:网络通信-socketserver:创建网络服务器

socketserver模块是创建网络服务器的框架,可处理TCP、UDP等同步网络请求,还提供mix - in类。它定义了5个服务器类,构造服务器需传递地址和请求处理器类。创建服务器可重用现有类并定制请求处理器,请求处理器负责多数请求处理工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

11.5 socketserver:创建网络服务器
socketserver模块是创建网络服务器的一个框架。它定义了一些类来处理TCP、UDP、UNIX流和UNIX数据报之上的同步网络请求(服务器请求处理器会阻塞,直至请求完成)。他还提供了一些"混入"类(mix-in),可以狠容易地转换服务器,为每个请求使用一个单独的线程或进程。
mix-in的作用是在运行期间动态改变类的基类或类的方法,使类的表现可以发生变化。
处理请求的责任被划分到一个服务器类的一个请求处理器类之间。服务器处理通信问题,如监听一个套接字并接受连接,请求处理器处理"协议"问题,如解释到来的数据、处理数据并把数据发回给客户。这种责任划分意味着很多应用可以使用某个现有的服务器类而不需要任何修改,另外可以为它提供一个请求处理器类以处理定制协议。

11.5.1 服务器类型
socketserver中定义了5个服务器类。BaseServer定义了API,这个类不能实例化,也不能直接使用。TCPServer使用TCP/IP套接字来通信,UDPServer使用数据报套接字。UnixStreamServer和UnixDatagramServer使用UNIX域套接字,只适用用UNIX平台。

11.5.2 服务器对象
要构造一个服务器,需要向它传递一个地址(服务器将在这个地址监听请求),以及一个请求处理器类(而非实例)。地址格式取决于所使用的服务器类型和套接字簇。可以参考socket模块文档来了解有关的详细内容。
一旦实例化服务器对象,则可以使用handle_request()或server_forever()来处理请求。server_forever()方法在一个无限循环中调用handle_request(),不过如果应用需要将服务器与另一个事件循环集成,或者要使用select()监视对应不同服务器的多个套接字,那么也可以直接调用handle_request()。

11.5.3 实现服务器
创建一个服务器时,通常重用某个现有的类并提供一个定制请求处理器类就足够了。但对于另外一些情况,BaseServer还包含一些方法,可以在子类中覆盖这些方法。
verify_request(request,client_address):返回True表示要处理请求,返回False则忽略请求。例如,一个服务器可能拒绝来自某个IP段的请求,或者如果服务器负载过重则会拒绝请求。
process_request(request,client_address):调用finish_request()来具体完成处理请求的工作。这个方法还可以创建一个单独的线程或进程,就像mix-in类一样。
finish_request(request,client_address):使用提供给服务器构造函数的类创建一个请求处理器实例。在这个请求处理器上调用handle()处理请求。

11.5.4 请求处理器
要接收到来的请求以及确定采取什么动作,大部分工作都由请求处理器完成。处理器负责在套接字层之上实现协议(即HTTP、XML-RPC或AMQP)。请求处理器从入站数据通道读取请求,处理这个请求,并写回一个响应。可以覆盖3个方法。
setup():为请求准备请求处理器。在StreamRequestHandler中,setup()方法会创建类似文件的对象来读写套接字。
handle():对请求完成具体工作。解析到来的请求,处理数据,并发出一个响应。
finish():清理setup()期间创建的所有数据。
很多处理器实现时可以只有一个handle()方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值