1.源码class
1.server类:处理链接 +------------+ | BaseServer | +------------+ | v +-----------+ +------------------+ | TCPServer |------->| UnixStreamServer | +-----------+ +------------------+ | v +-----------+ +--------------------+ | UDPServer |------->| UnixDatagramServer | +-----------+ +--------------------+ 1)进程类 +------------+ | BaseServer | +------------+ | v +------------+ | TCPServer | +------------+ | v +------------+ +------------------+ | ForkingMixIn| | UDPServer | +-----------+ +------------------+ | | v v 备注此类继承ForkingMixIn和TCPServer +------------------+ +--------------------+ | ForkingUDPServer | | ForkingTCPServer | +----------------+ +--------------------+ 2)线程类 +------------+ | BaseServer | +------------+ | v +------------+ | TCPServer | +------------+ | v +-----------+ +------------------+ | ThreadingMixIn| | UDPServer | +-----------+ +------------------+ | | v v 备注此类继承ThreadingMixIn和ThreadServer +------------------+ +--------------------+ | ThreadingUDPServer | | ThreadingTCPServer | +----------------+ +--------------------+ 2.request类: 处理通信 +-------------------------------------------+ | BaseRequestHandler | +------------------------------------------+ | | v v +--------------------+ +----------------------+ | StreamRequestHandler| |DatagramRequestHandler| +--------------------+ +-----------------------+ '''
2.创建socketserver步骤
创建一个socketserver 至少分以下几步: First, you must create a request handler class by subclassing the BaseRequestHandlerclass and overriding its handle() method; this method will process incoming requests. Second, you must instantiate one of the server classes, passing it the server’s address and the request handler class. Then call the handle_request() orserve_forever() method of the server object to process one or many requests. Finally, call server_close() to close the socket.
3.简单实例
#!/usr/bin/python env # coding:utf-8 import socketserver ip_port = ('127.0.0.1', 800) ''' def __init__(self, request, client_address, server): self.request = request self.client_address = client_address self.server = server self.setup() try: self.handle() finally: self.finish() ''' # tcp服务端并发 class MyServer(socketserver.BaseRequestHandler): def handle(self): print('conn is: ', self.request) # conn 链接 print('addr is: ', self.client_address) # addr 客户端地址 conn = self.request client_address = self.client_address while True: # 通信循环 try: # 处理client端端口 报出的异常 data = conn.recv(1024) if not data: break # 处理接受数据为空,无限循环 print('客户端发来的信息是:', data.decode('utf-8'), client_address) self.request.sendall(data) except Exception as e: print(e) break if __name__ == '__main__': s = socketserver.ThreadingTCPServer(ip_port, MyServer) # 多线程 连接循环 通信循环套在连接循环中 # s = socketserver.Forkingip_port,MyServer) #多进程 连接循环 通信循环套在连接循环中 s.serve_forever() # 客户端 from socket import * ip_port = ("127.0.0.1", 800) back_log = 10 buffer_size = 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(back_log) print("客户端发来信息:", data.decode("utf-8")) tcp_client.close()