socketserver
socketserver是基于socket写成的一个更强大的模块。
socketserver简化了网络服务器的编写。它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步。
在python3中该模块是socketserver,在python2中该模块是Socketserver
1 2 3 4 5 | 分情况导入导入模块 try : import socketserver #Python 3 except ImportError: import SocketServer #Python 2 |
服务器
服务器要使用处理程序,必须将其出入到服务器对象,定义了5个基本的服务器类型(就是“类”)。
BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer。 注意:BaseServer不直接对外服务。关系如下
服务器:
要使用处理程序,必须将其传入到服务器的对象,定义了四个基本的服务器类
(1)TCPServer(address,handler) 支持使用IPv4的TCP协议的服务器,address是一个(host,port)元组。Handler是BaseRequestHandler或StreamRequestHandler类的子类的实例。
(2)UDPServer(address,handler) 支持使用IPv4的UDP协议的服务器,address和handler与TCPServer中类似。
(3)UnixStreamServer(address,handler) 使用UNIX域套接字实现面向数据流协议的服务器,继承自TCPServer。
(4)UnixDatagramServer(address,handler) 使用UNIX域套接字实现数据报协议的服务器,继承自UDPServer。
这四个类的实例都有以下方法。
1、s.socket 用于传入请求的套接字对象。
2、s.sever_address 监听服务器的地址。如元组("127.0.0.1",80)
3、s.RequestHandlerClass 传递给服务器构造函数并由用户提供的请求处理程序类。
4、s.serve_forever() 处理无限的请求 #无限处理client连接请求
5、s.shutdown() 停止serve_forever()循环
SocketServer模块中主要的有一下几个类
1、BaseServer 包含服务器的核心功能与混合类(mix-in)的钩子功能。这个类主要用于派生,不要直接生成这个类的类对象,可以考虑使用TCPServer和UDPServer类。
2、TCPServer 基本的网络同步TCP服务器
3、UDPServer 基本的网络同步UDP服务器
4、ForkingTCPServer 是ForkingMixIn与TCPServer的组合
5、ForkingUDPServer 是ForkingMixIn与UDPServer的组合
6、ThreadingUDPServer 是ThreadingMixIn和UDPserver的组合
7、ThreadingTCPServer 是ThreadingMixIn和TCPserver的组合
8、BaseRequestHandler 必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()方法。
9、StreamRequestHandler 实现TCP请求处理类的
10、DatagramRequestHandler 实现UDP请求处理类的
11、ThreadingMixIn 实现了核心的线程化功能,用于与服务器类进行混合(mix-in),以提供一些异步特性。不要直接生成这个类的对象。
12、ForkingMixIn 实现了核心的进程化功能,用于与服务器类进行混合(mix-in),以提供一些异步特性。不要直接生成这个类的对象。
关系图如下:
创建服务器的步骤
1:首先必须创建一个请求处理类
2:它是BaseRequestHandler的子类
3:该请求处理类是BaseRequestHandler的子类并重新写其handle()方法
实例化 请求处理类传入服务器地址和请求处理程序类
最后实例化调用serve_forever() #无限处理client请求
简单实例tcp方式
服务器server端,多线程方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import socketserver class Myserver(socketserver.BaseRequestHandler): #基本的通信循环 def handle( self ): print ( "连接:》》" , self .request) #与client的链接请求信息 print ( "addr :>>" , self .client_address) #获取client的地址和端口号 while True : try : data = self .request.recv( 1024 ) if not data: break print ( "收到client消息是:>>" ,data.decode( "utf-8" ), self .client_address) back_data = input ( ":>>" ) self .request.sendall(back_data.encode( "utf-8" )) except Exception: break if __name__ = = '__main__' : s = socketserver.ThreadingTCPServer(( "127.0.0.1" , 8000 ),Myserver) #开启多线程,绑定地址,和处理通信的类 print ( "\033[1;33mstart\033[0m" .center( 50 , "#" )) s.serve_forever() #连接循环 |
client端
1 2 3 4 5 6 7 8 9 10 11 12 13 | from socket import * ip_port = ( "127.0.0.1" , 8000 ) buffersize = 1024 tcp_client = socket(AF_INET,SOCK_STREAM) tcp_client.connect(ip_port) while True : msg = input ( ":>>>>" ) if not msg: continue tcp_client.send(msg.encode( "utf-8" )) data = tcp_client.recv(buffersize) print ( "客户端收到的消息是" ,data.decode( "utf-8" )) |
1.开启程序
2.client连接
3.开始通信
简单示例udp方式:
程序server端
1 2 3 4 5 6 7 8 9 10 11 | import socketserver class Myserver(socketserver.BaseRequestHandler): def handle( self ): print ( self .request) print ( "收到客户端的消息是:》" , self .request[ 0 ]) self .request[ 1 ].sendto( self .request[ 0 ].upper(), self .client_address) if __name__ = = '__main__' : s = socketserver.ThreadingUDPServer(( "127.0.0.1" , 8000 ),Myserver) print ( "\033[1;33mstart\033[0m" .center( 50 , "#" )) s.serve_forever() |
client端
1 2 3 4 5 6 7 8 9 10 11 12 13 | from socket import * ip_port = ( "127.0.0.1" , 8000 ) buffersize = 1024 udp_client = socket(AF_INET,SOCK_DGRAM) udp_client.connect(ip_port) while True : msg = input ( ":>>>>" ) if not msg: continue udp_client.sendto(msg.encode( "utf-8" ),ip_port) data,addr = udp_client.recvfrom(buffersize) print ( "客户端收到的消息是" ,data.decode( "utf-8" )) |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步