socketserver简单介绍
''' socketserver:是对socket的封装,实现并发处理 前两个TCP,UDP常用,后两个不常用 ''' import socketserver socketserver.TCPServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # TCP协议 socketserver.UDPServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # UDP协议 socketserver.UnixStreamServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # unix下tcp socketserver.UnixDatagramServer(server_address="",RequestHandlerClass="",bind_and_activate=True) # unix下udp ''' +------------+ | BaseServer | +------------+ | v +-----------+ +------------------+ | TCPServer |------->| UnixStreamServer | +-----------+ +------------------+ | v +-----------+ +--------------------+ | UDPServer |------->| UnixDatagramServer | +-----------+ +--------------------+ ''' ''' 创建一个SocketServer分三步: 一、创建BaseRequestHandler的子类并重写handle()方法 二、实例化TCPServer(或其他三种),传递IP和上面创建的子类做为参数 三、server.handle_request() #处理一个请求,一般不用 server.serve_forever() # 处理多个请求 '''
''' ===============BaseServer的方法============== fileno() 返回文件描述符 handle_request() 处理单个请求 serve_forever(poll_interval=0.5) 处理请求直到收到shutdown请求,每0.5秒检查一次是否发了shutdown 清理工作可以放在service_actions()里面 service_actions() shutdown之后的清理工作 shutdown() 停止 server_close() 关闭 allow_reuse_address()允许重用地址,看见过address already in use, 突然断开客户端没有断开,在socket上server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) timeout() handleRequest里面用的 self.setup() 请求进来前 try: self.handle() 请求处理中 finally: self.finish() 最后 '''
服务器:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): ''' 跟客户端所有的交互都是在handle里完成的,每次请求都新建一个Handler实例 self.request 服务端收发数据的句柄 self.data 存放在实例里的数据 self.client_address[0] 客户端IP地址 ''' def handle(self): while True: try: self.data = self.request.recv(1024).decode() self.data = self.data.upper() self.request.send(self.data.encode()) except ConnectionResetError as e: print("连接断开",e) break if __name__ == '__main__': # server = socketserver.TCPServer(("127.0.0.1", 6969), MyTCPHandler) 跟之前的socket一样不支持并发 server = socketserver.ThreadingTCPServer(("127.0.0.1", 6969), MyTCPHandler) #多线程 # server = socketserver.ForkingTCPServer(("127.0.0.1", 6969), MyTCPHandler) #多进程,Linux里好使,Windows里不好使 server.serve_forever()
客户端:
import socket client = socket.socket() client.connect(("127.0.0.1",6969)) while True: data = input(">>").strip() client.send(data.encode()) data = client.recv(1024).decode() print(data)