创建一个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 socketserverclass MyServer(socketserver.BaseRequestHandler): #这里我们过来一个连接,就创建一个连接实例def handle(self):'''这个是固定的,就要定义一个handle的函数,这里的self代表的就是过来的一个连接实例,这一步操作就相当于之前的tcp_server.accept()操作:return:'''print('conn is: ',self.request) #connprint('addr is: ',self.client_address) #addrwhile True: # 这里就是一个通信循环try:#收消息data=self.request.recv(1024)if not data:breakprint('收到客户端的消息是',data,self.client_address)#发消息self.request.sendall(data.upper())except Exception as e:print(e)breakif __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