SocketServer-实现并发处理3
用socketserver创建一个服务的步骤:
1 创建一个request handler class(请求处理类),合理选择StreamRequestHandler和DatagramRequestHandler之中的一个作为父类(当然,使用BaseRequestHandler作为父类也可),并重写它的handle()方法。
2 实例化一个server class(服务类)对象,并将服务的地址和之前创建的request handler class传递给它。
3 调用server class对象的handle_request() 或 serve_forever()方法来开始处理请求。
服务器端代码:
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): #自己写的请求处理类,每个客户端的请求过来,都会实例它。MyTCPHandler def handle(self): #重写请求处理类的handle(),跟客户端所有的交互都是在handle里完成的。 while True: try: self.data = self.request.recv(1024).strip() print("{} wrote:".format(self.client_address[0])) #打印客户端的IP地址 print(self.data) self.request.sendall(self.data.upper()) #变成大写,传回给客户端。 except ConnectionResetError as e: print('Error is: ',e) #客户端断开时抛出的异常 break if __name__ == "__main__": HOST, PORT = "localhost", 9999 server = socketserver.ThreadingTCPServer((HOST, PORT), MyTCPHandler) #实例化一个server class(服务类)对象,并将服务的地址和之前创建的request handler class传递给它 server.serve_forever() #调用server class对象的serve_forever()方法来开始处理请求。处理多个请求。
客户端代码:
import socket client=socket.socket() client.connect(('localhost',9999)) while True: msg=input(">>:").strip() if len(msg)==0:continue client.send(msg.encode('utf-8')) data=client.recv(1024) print("recv:",data.decode()) client.close()