创建一个socketserver 至少分以下几步:
- First, you must create a request handler class by subclassing the
BaseRequestHandler
class and overriding itshandle()
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.
import socketserver class MyServer(socketserver.BaseRequestHandler): #这里我们过来一个连接,就创建一个连接实例 def handle(self): ''' 这个是固定的,就要定义一个handle的函数,这里的self代表的就是过来的一个连接实例,这一步操作就相当于之前的tcp_server.accept()操作 :return: ''' print('conn is: ',self.request) #conn print('addr is: ',self.client_address) #addr while True: # 这里就是一个通信循环 try: #收消息 data=self.request.recv(1024) if not data:break print('收到客户端的消息是',data,self.client_address) #发消息 self.request.sendall(data.upper()) except Exception as e: print(e) break if __name__ == '__main__': s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyServer) #多线程的Tcp服务端(实现并发,开启多个任务来给客户端链接) s.serve_forever() #socketserver.ThreadingTCPServer + serve_forever 实现连接循环,连接循环里面我们套了一个通信循环MyServer ''' 工作原理: ThreadingTCPServer(多线程处理连接) + serve_forever(连接循环) + MyServer(通信循环) ThreadingTCPServer 是多线程的 那么当每过来一个客户端请求的时候,都会通过MyServer进行实例化得到一个结果去和客户端通信。当第二个连接过来的额时候,因为我们是多线程的,所以其他的线程就拿着MyServer类进行实例得到一个对象,然后用MyServer里的handle方法进行通信 '''
实现原理图解:
笔记整理来自海峰老师的视频:
外加一个Alex的链接 http://www.cnblogs.com/alex3714/articles/5830365.html