一、概述
并不能多并发,只能支持一个用户, 模块是 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 地址和端口号。最后,我们使用 方法启动服务器,以便处理客户端请求。
领取专属 10元无门槛券
私享最新 技术干货