socketserver是啥?
简化了编写网络服务器,就是对于socket的再一次封装
sockerserver包含4个类可使用:
A=socketserver.TCPServer() #用于TCP/IP传输 #这是最经常使用的
B=socketserver.UDPServer() #用于UDP传输 #这个也还好
C=socketserver.UnixStreamServer() #基于TCP的unix本机的进程间的通信 #不经常使用
D=socketserver.UnixDatagramServer() #基于UDP的unix本机的进程间的通信 #不经常使用
建立一个socketserver须要如下步骤:
一、必须建立一个请求处理类,这个类是继承BaseRequestHandler,还必须重写父类的handle方法
二、必须实例化一个服务类实例(TCPServer、UPPServer、UnixStreamServer、UnixDatagramServer)中的一个,通常是TCPServer,而且把监听地址和以前建立的请求处理类作为实例化参数传给这个服务类实例。
三、而后执行服务类实例的handle_request() 或者 server_forever()方法。咱们通常不用handle_request()方法,费半天劲写服务,固然是永久执行,接请求啦,因此就是执行server_forever()方法
四、最后,执行 server_close()方法来关闭服务。
例子:最简单的socketserver
import socketserver class MyHandle(socketserver.BaseRequestHandler): # 建立请求处理类 继承socketserver.BaseRequestHandler类,每个客户端连接过来都会实例化这个类 --> 步骤:1 def handle(self): #重写覆盖掉父类的handle方法,父类的handle方法是空的,全部与客户端的交互都是handle方法中。 --> 步骤:1 while True: #这里,既然是handle负责与处理客户端的全部交互,但是handle终究是函数,执行完就完了,第二个请求过来就没人处理了。因此要循环一下的 try: self.data=self.request.recv(1024).strip() #self.request.recv() 这就是接收客户端请求。(request这个词是被写死的,不能改为其余) print("{} wrote:".format(self.client_address)) # 开始业务处理 print(self.data) self.request.send(self.data.upper()) # 业务就是把传进来的东西大写了 except ConnectionResetError as e: #这是捕获客户端关闭的异常,python3有这个异常,python2的话,只能断定data为空了 print(self.client_address,e) break def setup(self): # 和handle 都是父类的方法名,能够重写,做用是开始业务以前作的事情 pass def finish(self): # 和handle都是父类的方法名,能够重写,调用handle后会执行,并且不论handle是否成功都会执行 pass if __name__=="__main__": host,port="0.0.0.0",9999 #监听地址和端口 # server=socketserver.TCPServer((host,port),MyHandle) #实例化一个TCPServer,而且传递一个地址,和业务处理类 --> 步骤:2 server = socketserver.ThreadingTCPServer((host, port), MyHandle) # 实例化一个多线程的TCPServer,也就是ThreadingTCPServer而且传递一个地址,
# 和业务处理类,不是业务处理实例 --> 步骤:2 #每一个服务类实例都有对应的多线程服务类,传参是同样的。 print(server.server_address) print(server.socket,type(server.socket)) # print(server.get_request()) server.serve_forever() #启动服务 --> 步骤:3 server.shutdown() #中止服务 --> 步骤4
socketserver提供的一些平时用不太上,有时又有点用的东东:python
socketserver.ThreadingTCPServer.RequestHandlerClass.handle()socketserver.ThreadingTCPServer.fileno() #返回文件描述符 不太用的到。。。socketserver.ThreadingTCPServer.handle_request() #处理单个请求,基本不用这个。socketserver.ThreadingTCPServer.serve_forever() # 一直处理请求,直到收到一个明确的shutdown()请求,过程是会调用service_actions()方法socketserver.ThreadingTCPServer.service_actions() #当服务中止时,进行收尾工做,处理僵尸什么的 python3.3加入的socketserver.ThreadingTCPServer.shutdown() #告诉 server_forver(),能够停掉了socketserver.ThreadingTCPServer.server_close() #关闭socketserver.ThreadingTCPServer.address_family #这是地址簇的变量,实例化服务类以前明确设定。socketserver.ThreadingTCPServer.RequestHandlerClass #这是请求处理类,须要被继承,而且实现handle业务方法socketserver.ThreadingTCPServer.server_address #服务绑定的监听地址,元组socketserver.ThreadingTCPServer.socket #服务的socketsocketserver.ThreadingTCPServer.get_request() #获取请求的socket.accept(),会阻塞 不怎么用这个