首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python 高级编程之网络编程 SocketServer(七)

一、概述

不能多并发,只能支持一个用户, 模块是 Python 中用于创建网络服务器的模块,提供了一种简单而一致的接口。它是构建网络服务器的框架,处理了创建、维护和关闭连接的许多底层细节,是的再封装

在中为

在种取消了首字母大写,改名为。

socketserver中包含了两种类,

一种为服务类(server class):前者提供了许多方法:像绑定,监听,运行…… (也就是建立连接的过程) 。

一种为请求处理类(request handle class):专注于如何处理用户所发送的数据(也就是事务逻辑)。

一般情况下,所有的服务,都是先建立连接,也就是建立一个服务类的实例,然后开始处理用户请求,也就是建立一个请求处理类的实例。

模块提供了几个类,包括:

:实现服务器的基本类。

:处理 TCP 连接的服务器。

:处理 UDP 连接的服务器。

:类似于TCPServer提供面向数据流的套接字连接,但是旨在UNIX平台上可用。

:类似于UDPServer提供面向数据报的套接字连接,但是旨在UNIX平台上可用。

:实现了核心的进程化功能,用于与服务器类进行混合,提供异步特性。

:实现了核心的线程化功能,用于与服务器类进行混合,异步特性。

:每个请求创建一个新进程的 ForkingMixInTCPServer`组合。

:每个请求创建一个新进程的  服务器。和组合。

:在单独的线程中处理每个请求的 TCP 服务器。和组合。

:在单独的线程中处理每个请求的 UDP 服务器。和组合。

:用于定制Handler类型,自定义的Handler类型只要继承自BaseRequestHandler,并覆盖写入它的handle() 方法即可。

:TCP请求处理类的一个实现。

:UDP请求处理类的一个实现。

server类继承关系:

请求处理类继承关系:

编程可以参考我这篇文章:Python 高级编程之网络编程 Socket(六)

二、socket 模块与 socketserver 关系

和  是两个不同的 Python 模块,都用于网络编程。

模块提供了通用的套接字编程接口,可用于创建客户端和服务器端程序。它涵盖了与网络通信相关的底层细节,如创建套接字、绑定地址、监听请求、接受连接、发送数据和接收数据。

模块是 socket 模块的一个封装,它抽象了服务器端网络编程的复杂度,使您能够快速编写服务器端程序。它提供了多种服务器类型,如多线程服务器多进程服务器单进程服务器,以满足不同的网络编程需求。此外,它还提供了简单的面向对象编程模型,允许您扩展基础类并定制服务器行为。

总而言之,如果您需要快速编写简单的服务器端程序,那么  模块可能是您的最佳选择;如果您需要更多的灵活性和细节控制,则可以使用  模块。

在解析socketserver是如工作之前,我们先看看socektserver类的继承关系图:

三、socketserver 模块使用

继承关系图中有五个类,其中四个类表示四种类型的同步服务器:

1)创建 TCPServer

TCPServer 类是 Python3 中基于  协议的多线程服务器类

语法规则:

使用 UDPServer 类时,您可以指定下列三个参数:

:服务器的地址,他应该是一个元组包含地址和端口如:("localhost", 9000)。

:我们自定义的类,类中必须重写handle()方法。用于处理所有socket请求。

:如果为True,将自动调用server_bind()和server_activate()。一般默认即可。

下面是一个使用 TCPServer 类的简单示例:

该代码定义了一个简单的多线程服务器,它绑定在本地主机(localhost)的端口号 9999 上。当有客户端连接时,服务器会接收客户端发送的数据,然后将数据转换为大写并发送回客户端。

请注意,您需要创建一个名为 MyTCPHandler 的处理程序类,该类必须从  类继承,并实现 handle 方法。在 handle 方法中,您可以处理客户端请求,并向客户端发送响应数据。

最后,您可以通过调用  方法启动服务器,并使其处于持续监听状态。

2)创建 UDPServer

是 socketserver 模块中用于创建  服务器的类。

语法规则:

使用 UDPServer 类时,您可以指定下列三个参数:

:服务器的 IP 地址和端口号。例如:("localhost", 9999)。

:处理客户端请求的处理程序类。例如:MyUDPHandler。

:如果为True,将自动调用server_bind()和server_activate()。一般默认即可。

四、异步服务器类(对线程、多进程)

模块中也提供了一些异步服务器类,它们可以在单独的线程中处理多个客户端请求,从而提高服务器的并发性能。下面一一介绍。

1)ThreadingMixIn(多线程)

类是 socketserver 模块中的一个异步服务器类,用于创建基于多线程的异步服务器

您可以通过继承该类来创建自己的异步服务器类,然后通过该类创建服务器。例如,创建一个基于多线程的异步 TCP 服务器的代码如下:

在这里,您需要创建一个名为  的处理程序类,该类必须从  类继承,并实现  方法。该方法是处理客户端请求的核心方法,在该方法中您可以处理客户端请求,并向客户端发送响应数据。

在创建基于多线程的异步服务器时,每个客户端请求都会在一个单独的线程中处理,从而提高服务器的并发性能。

完整实例如下:

输出:

2)ForkingMixIn(多进程)

类是 socketserver 模块中的一个异步服务器类,用于创建基于多进程的异步服务器。

您可以通过继承该类来创建自己的异步服务器类,然后通过该类创建服务器。例如,创建一个基于多进程的异步 TCP 服务器的代码如下:

在这里,您需要创建一个名为  的处理程序类,该类必须从  类继承,并实现  方法。该方法是处理客户端请求的核心方法,在该方法中您可以处理客户端请求,并向客户端发送响应数据。

在创建基于多进程的异步服务器时,每个客户端请求都会在一个单独的进程中处理,从而提高服务器的并发性能。

【注意】在 Unix 系统上,使用多进程的异步服务器可能会导致内存占用增加。因此,在 Unix 系统上,建议使用多线程的异步服务器。

3)ForkingTCPServer (TCP 多进程)

是 socketserver 模块中的一个异步服务器类,用于创建基于多进程的 TCP 服务器。

要使用  类,您需要提供服务器的 IP 地址和端口号,以及处理客户端请求的处理程序类。

以下是一个使用 ForkingTCPServer 类的示例:

在这个示例中,我们创建了一个名为  的处理程序类,该类从  类继承,并实现了  方法。该方法是处理客户端请求的核心方法,在该方法中您可以处理客户端请求,并向客户端发送响应数据。

接下来,我们使用 socketserver.ForkingTCPServer 类创建了一个 TCP 服务器,并绑定了服务器的 IP 地址和端口号。最后,我们使用 serve_forever 方法启动服务器,以便处理。

4)ForkingUDPServer (UDP 多进程)

是 socketserver 模块中的一个异步服务器类,用于创建基于多进程的 UDP 服务器。

要使用  类,您需要提供服务器的 IP 地址和端口号,以及处理客户端请求的处理程序类。

以下是一个使用 ForkingUDPServer 类的示例:

在这个示例中,我们创建了一个名为  的处理程序类,该类从  类继承,并实现了  方法。该方法是处理客户端请求的核心方法,在该方法中您可以处理客户端请求,并向客户端发送响应数据。

接下来,我们使用  类创建了一个 UDP 服务器,并绑定了服务器的 IP 地址和端口号。最后,我们使用  方法启动服务器,以便处理客户端请求。

5)ThreadingTCPServer(TCP 多线程)

是 socketserver 模块中的一个异步服务器类,用于创建基于多线程的 TCP 服务器

要使用 ThreadingTCPServer 类,您需要提供服务器的 IP 地址和端口号,以及处理客户端请求的处理程序类。

以下是一个使用 ThreadingTCPServer 类的示例:

在这个示例中,我们创建了一个名为  的处理程序类,该类从  类继承,并实现了  方法。该方法是处理客户端请求的核心方法,在该方法中您可以处理客户端请求,并向客户端发送响应数据。

接下来,我们使用  类创建了一个  服务器,并绑定了服务器的 IP 地址和端口号。最后,我们使用  方法启动服务器,以便处理客户端请求。

5)ThreadingUDPServer(UDP 多线程)

是 socketserver 模块中的一个异步服务器类,用于创建基于多线程的  服务器。

要使用  类,您需要提供服务器的 IP 地址和端口号,以及处理客户端请求的处理程序类。

以下是一个使用 ThreadingUDPServer 类的示例:

在这个示例中,我们创建了一个名为  的处理程序类,该类从  类继承,并实现了  方法。该方法是处理客户端请求的核心方法,在该方法中您可以处理客户端请求,并向客户端发送响应数据。

接下来,我们使用  类创建了一个  服务器,并绑定了服务器的 IP 地址和端口号。最后,我们使用  方法启动服务器,以便处理客户端请求。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230502A00X8H00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券