標籤:流服務 異常 down class python2 大小 property mixin 重用
一:socketserver簡化了網路伺服器的編寫。
它有4個類:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer。
這4個類是同步進行處理的,另外通過ForkingMixIn和ThreadingMixIn類來支援非同步
class socketserver.TCPServer(server_address, RequestHandlerClass, bind_and_activate=True)
class socketserver.UDPServer(server_address, RequestHandlerClass, bind_and_activate=True)
class socketserver.UnixStreamServer(server_address, RequestHandlerClass, bind_and_activate=True)
class socketserver.UnixDatagramServer(server_address, RequestHandlerClass,bind_and_activate=True)
class socketserver.ForkingTCPServer
class socketserver.ForkingUDPServer
class socketserver.ThreadingTCPServer
class socketserver.ThreadingUDPServer
二:有五個類之間的繼承關係
+------------+| BaseServer |+------------+ | v+-----------+ +------------------+| TCPServer |------->| UnixStreamServer |+-----------+ +------------------+ | v+-----------+ +--------------------+| UDPServer |------->| UnixDatagramServer |+-----------+ +--------------------+
UnixStreamServer 繼承-TCPServer繼承BaseServer
UnixDatagramServer 繼承UDPServer繼承TCPServer繼承BaseServer
三:使用步驟
1)你必須自己建立一個請求類,並繼承BaseRequestHandler,並重構hanndle方法
2)你必須執行個體化TCPServer,並且傳遞server ip和上面建立的請求的類
3)調用handle_request()方法或者server_forever()方法,handle_request,只處理一個請求,server_forever 處理N多請求
4)關閉call_server()
建立伺服器的步驟。首先,你必須建立一個請求處理類,它是BaseRequestHandler的子類並重載其handle()方法。
其次,你必須執行個體化一個伺服器類,傳入伺服器的地址和請求處理常式類。
最後,調用handle_request()(一般是調用其他事件迴圈或者使用select())或serve_forever()。
四: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可以讀取或寫入,以獲得請求資料或將資料返回到用戶端。
操作 python基礎學習日誌day8-socketserver