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(),會阻塞 不怎麼用這個