5月4日 python學習總結 socketserver

來源:互聯網
上載者:User

標籤:程式   通訊端   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不直接對外服務。

伺服器對象
  • class SocketServer.BaseServer:這是模組中的所有伺服器對象的超類。它定義了介面,如下所述,但是大多數的方法不實現,在子類中進行細化。

  • BaseServer.fileno():返回伺服器監聽通訊端的整數檔案描述符。通常用來傳遞給select.select(), 以允許一個進程監視多個伺服器。

  • BaseServer.handle_request():處理單個請求。處理順序:get_request(), verify_request(), process_request()。如果使用者提供handle()方法拋出異常,將調用伺服器的handle_error()方法。如果self.timeout內沒有請求收到, 將調用handle_timeout()並返回handle_request()。

  • BaseServer.serve_forever(poll_interval=0.5): 處理請求,直到一個明確的shutdown()請求。每poll_interval秒輪詢一次shutdown。忽略self.timeout。如果你需要做周期性的任務,建議放置在其他線程。

  • BaseServer.shutdown():告訴serve_forever()迴圈停止並等待其停止。python2.6版本。

  • BaseServer.address_family: 地址家族,比如socket.AF_INET和socket.AF_UNIX。

  • BaseServer.RequestHandlerClass:使用者提供的請求處理類,這個類為每個請求建立執行個體。

  • BaseServer.server_address:伺服器偵聽的地址。格式根據協議家族地址的各不相同,請參閱socket模組的文檔。

  • BaseServer.socketSocket:伺服器上偵聽傳入的請求socket對象的伺服器。

伺服器類支援下面的類變數:

  • BaseServer.allow_reuse_address:伺服器是否允許地址的重用。預設為false ,並且可在子類中更改。

  • BaseServer.request_queue_size

請求隊列的大小。如果單個請求需要很長的時間來處理,伺服器忙時請求被放置到隊列中,最多可以放request_queue_size個。一旦隊列已滿,來自用戶端的請求將得到 “Connection denied”錯誤。預設值通常為5 ,但可以被子類覆蓋。

  • BaseServer.socket_type:伺服器使用的通訊端類型; socket.SOCK_STREAM和socket.SOCK_DGRAM等。

  • BaseServer.timeout:逾時時間,以秒為單位,或 None表示沒有逾時。如果handle_request()在timeout內沒有收到請求,將調用handle_timeout()。

下面方法可以被子類重載,它們對伺服器對象的外部使用者沒有影響。

  • BaseServer.finish_request():實際處理RequestHandlerClass發起的請求並調用其handle()方法。 常用。

  • BaseServer.get_request():接受socket請求,並返回二元組包含要用於與用戶端通訊的新socket對象,以及用戶端的地址。

  • BaseServer.handle_error(request, client_address):如果RequestHandlerClass的handle()方法拋出異常時調用。預設操作是列印traceback到標準輸出,並繼續處理其他請求。

  • BaseServer.handle_timeout():逾時處理。預設對於forking伺服器是收集退出的子進程狀態,threading伺服器則什麼都不做。

  • BaseServer.process_request(request, client_address) :調用finish_request()建立RequestHandlerClass的執行個體。如果需要,此功能可以建立新的進程或線程來處理請求,ForkingMixIn和ThreadingMixIn類做到這點。常用。

  • BaseServer.server_activate():通過伺服器的建構函式來啟用伺服器。預設的行為只是監聽伺服器通訊端。可重載。

  • BaseServer.server_bind():通過伺服器的建構函式中調用綁定socket到所需的地址。可重載。

  • BaseServer.verify_request(request, client_address):返回一個布爾值,如果該值為True ,則該請求將被處理,反之請求將被拒絕。此功能可以重寫來實現對伺服器的存取控制。預設的實現始終返回True。client_address可以限定用戶端,比如只處理指定ip區間的請求。 常用。

要求處理常式

處理器接收資料並決定如何操作。它負責在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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.