標籤:程式 通訊端 request 127.0.0.1 處理異常 建構函式 nec 字元 linux系統
一、socketserver
SocketServer簡化了網路伺服器的編寫。
它有4個類:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。這4個類是同步進行處理的,另外通過ForkingMixIn和ThreadingMixIn類來支援非同步。
建立伺服器的步驟:
1、首先, 必須建立一個請求處理類,它是BaseRequestHandler的子類並重載其handle()方法。
2、其次, 必須執行個體化一個伺服器類,傳入伺服器的地址和請求處理常式類。
3、最後,調用handle_request()(一般是調用其他事件迴圈或者使用select())或serve_forever()。
整合ThreadingMixIn類時需要處理異常關閉。daemon_threads指示伺服器是否要等待線程終止,要是線程互相獨立,必須要設定為True,預設是False。
無論用什麼網路通訊協定,伺服器類有相同的外部方法和屬性。
該模組在python3中已經更名為socketserver。
伺服器類型
5種類型:BaseServer,TCPServer,UnixStreamServer,UDPServer,UnixDatagramServer。 注意:BaseServer不直接對外服務。
伺服器對象
伺服器類支援下面的類變數:
請求隊列的大小。如果單個請求需要很長的時間來處理,伺服器忙時請求被放置到隊列中,最多可以放request_queue_size個。一旦隊列已滿,來自用戶端的請求將得到 “Connection denied”錯誤。預設值通常為5 ,但可以被子類覆蓋。
下面方法可以被子類重載,它們對伺服器對象的外部使用者沒有影響。
要求處理常式
處理器接收資料並決定如何操作。它負責在socket層之上實現協議(i.e., HTTP, XML-RPC, or AMQP),讀取資料,處理並寫反應。可以重載的方法如下:
setup(): 準備請求處理. 預設什麼都不做,StreamRequestHandler中會建立檔案類似的對象以讀寫socket.
handle(): 處理請求。解析傳入的請求,處理資料,並發送響應。預設什麼都不做。常用變數:self.request,self.client_address,self.server。
finish(): 環境清理。預設什麼都不做,如果setup產生異常,不會執行finish。
通常只需要重載handle。self.request的類型和資料報或流的服務不同。對於流服務,self.request是socket 對象;對於資料報服務,self.request是字串和socket 。可以在子類StreamRequestHandler或DatagramRequestHandler中重載,重寫setup()和finish() ,並提供self.rfile和self.wfile屬性。 self.rfile和self.wfile可以讀取或寫入,以獲得請求資料或將資料返回到用戶端。
執行個體:
基於TCP:
import socketserver# 通訊迴圈class MytcpHandler(socketserver.BaseRequestHandler): def hahahahahahahh(self): while True: try: data = self.request.recv(1024) # 1024 接收資料的最大限制 if not data: break # 針對linux系統 self.request.send(data.upper()) # 注意:收發都是以bytes為單位 except ConnectionResetError: break self.request.close()if __name__ == ‘__main__‘: #串連迴圈 server=socketserver.ThreadingTCPServer((‘127.0.0.1‘,8080),MytcpHandler) server.serve_forever() print(server.server_address) print(server.RequestHandlerClass) print(server.socket)#conn,client_addr=sock.accpet()# request, client_address = self.get_request()# self.process_request(conn, client_address)# self.finish_request(conn, client_address)# obj=MytcpHandler(conn,client_address,server)
基於UDP:
import socketserver# 通訊迴圈class MyUDPHandler(socketserver.BaseRequestHandler): def handle(self): # print(self.request) res=self.request[0] print(‘用戶端發來的資料:‘,res) self.request[1].sendto(res.upper(),self.client_address)if __name__ == ‘__main__‘: #串連迴圈 server=socketserver.ThreadingUDPServer((‘127.0.0.1‘,8080),MyUDPHandler) server.serve_forever()
5月4日 python學習總結 socketserver