【一】引入
socket
并不能多并发,只能支持一个用户socketserver
模块是 Python 中用于创建网络服务器的模块,提供了一种简单而一致的接口。- 它是构建网络服务器的框架,处理了创建、维护和关闭连接的许多底层细节
socketserver
是socket
的再封装。
【二】socketserver介绍
【1】简介
-
socketserver在python2中为SocketServer
- 在python3种取消了首字母大写,改名为socketserver。
-
socketserver中包含了两种类,
- 一种为服务类(server class):前者提供了许多方法
- 像绑定,监听,运行…… (也就是建立连接的过程) 。
- 一种为请求处理类(request handle class)
- 专注于如何处理用户所发送的数据(也就是事务逻辑)。
- 一种为服务类(server class):前者提供了许多方法
-
一般情况下,所有的服务,都是先建立连接,也就是建立一个服务类的实例,然后开始处理用户请求,也就是建立一个请求处理类的实例。
【2】socketserver
模块中的类
-
BaseServer:实现服务器的基本类。
-
TCPServer:处理 TCP 连接的服务器。
-
UDPServer:处理 UDP 连接的服务器。
-
UnixStreamServer:类似于TCPServer提供面向数据流的套接字连接,但是旨在UNIX平台上可用。
-
UnixDatagramServer:类似于UDPServer提供面向数据报的套接字连接,但是旨在UNIX平台上可用。
-
ForkingMixIn:实现了核心的进程化功能,用于与服务器类进行混合,提供异步特性。
-
ThreadingMixIn:实现了核心的线程化功能,用于与服务器类进行混合,异步特性。
-
ForkingTCPServer:每个请求创建一个新进程的 TCP 服务器。ForkingMixIn和TCPServer`组合。
-
ForkingUDPServer:每个请求创建一个新进程的 UDP 服务器。ForkingMixIn和UDPServer组合。
-
ThreadingTCPServer:在单独的线程中处理每个请求的 TCP 服务器。ThreadingMixIn和TCPServer组合。
-
ThreadingUDPServer:在单独的线程中处理每个请求的 UDP 服务器。ThreadingMixIn和UDPServer组合。
-
BaseRequestHandler:用于定制Handler类型,自定义的Handler类型只要继承自BaseRequestHandler,并覆盖写入它的handle() 方法即可。
-
StreamRequestHandler:TCP请求处理类的一个实现。
-
DataStreamRequestHandler:UDP请求处理类的一个实现。
【3】server类继承关系
【4】请求处理类继承关系
【三】socket 模块与 socketserver 关系
-
socket 和 socketserver 是两个不同的 Python 模块,都用于网络编程。
-
socket 模块提供了通用的套接字编程接口,可用于创建客户端和服务器端程序。
- 它涵盖了与网络通信相关的底层细节
- 如创建套接字、绑定地址、监听请求、接受连接、发送数据和接收数据。
-
socketserver 模块是 socket 模块的一个封装
- 它抽象了服务器端网络编程的复杂度,使您能够快速编写服务器端程序。
- 它提供了多种服务器类型
- 如多线程服务器、多进程服务器和单进程服务器,以满足不同的网络编程需求。
- 此外,它还提供了简单的面向对象编程模型,允许您扩展基础类并定制服务器行为。
-
小结
- 如果您需要快速编写简单的服务器端程序,那么 socketserver 模块可能是您的最佳选择
- 如果您需要更多的灵活性和细节控制,则可以使用 socket 模块。
【四】socketserver使用
- 继承关系图中有五个类,其中四个类表示四种类型的同步服务器:
+------------+
| BaseServer |
+------------+
|
v
+-----------+ +------------------+
| TCPServer |------->| UnixStreamServer |
+-----------+ +------------------+
|
v
+-----------+ +--------------------+
| UDPServer |------->| UnixDatagramServer |
+-----------+ +--------------------+
【1】创建 TCPServer
(1)语法规则
- TCPServer 类是 Python3 中基于
TCP
协议的多线程服务器类。
import socketserver
# 这将使用InternetTCP协议,该协议提供客户机和服务器之间的连续数据流。
# 如果 bind_and_activate 为true,构造函数自动尝试调用 server_bind() 和 server_activate() .
# 其他参数将传递给 BaseServer 基类。
servser = socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
# socketserver.UnixStreamServer:仅限于Unix系统的,Unix套接字流
servser = socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
-
使用 UDPServer 类时,可以指定下列三个参数
-
server_address:服务器的地址,他应该是一个元组包含地址和端口如:(“localhost”, 9000)。
-
RequestHandlerClass:我们自定义的类,类中必须重写handle()方法。用于处理所有socket请求。
-
bind_and_activate:如果为True,将自动调用server_bind()和server_activate()。一般默认即可。
-