亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python探索之SocketServer詳解

 更新時間:2017年10月28日 15:07:31   作者:Learn Python  
這篇文章主要介紹了Python探索之SocketServer詳解,小編覺得還是比較不錯的,這里分享給大家,供需要的朋友參考。

SocketServer,網(wǎng)絡(luò)通信服務(wù)器,是Python標準庫中的一個模塊,其作用是創(chuàng)建網(wǎng)絡(luò)服務(wù)器。SocketServer模塊定義了一些類來處理諸如TCP、UDP、UNIX流和UNIX數(shù)據(jù)報之上的同步網(wǎng)絡(luò)請求。

SocketServer模塊處理網(wǎng)絡(luò)請求的功能,可以通過兩個主要的類來實現(xiàn):一個是服務(wù)器類,一個是請求處理類。
服務(wù)器類 處理通信問題,如監(jiān)聽一個套接字并接收連接等;

請求處理類 處理“協(xié)議”問題,如解釋到來的數(shù)據(jù)、處理數(shù)據(jù)并把數(shù)據(jù)發(fā)回給客戶端等。

這種實現(xiàn)將服務(wù)器的實現(xiàn)過程和請求處理的實現(xiàn)過程解耦,這意味著我們可以將不同的服務(wù)器實現(xiàn)和請求處理實現(xiàn)結(jié)合起來來處理一些定制的協(xié)議,例如一個TCP服務(wù)器類和一個流請求處理類結(jié)合,處理基于TCP的網(wǎng)絡(luò)請求。同時,也可以基于SocketServer模塊中的服務(wù)器類和請求處理類,實現(xiàn)網(wǎng)絡(luò)層之上應(yīng)用層的服務(wù)器和請求處理實現(xiàn),例如基于TCP服務(wù)器類實現(xiàn)HTTP服務(wù)器,基于流處理請求類實現(xiàn)HTTP請求處理類等。

服務(wù)器類

SocketServer模塊中定義了五種服務(wù)器類。
BaseServer(服務(wù)器的基類,定義了API)
TCPServer(使用TCP/IP套接字)
UDPServer(使用數(shù)據(jù)報套接字)
UnixStreamServer(使用UNIX域套接字,只適用UNIX平臺)
UnixDatagramServer(使用UNIX域套接字,只適用UNIX平臺)

1. 構(gòu)造服務(wù)器對象

要構(gòu)建一個服務(wù)器對象,需要向它傳遞一個地址server_address(服務(wù)器將在這個地址上監(jiān)聽請求),以及一個請求處理類RequestHandlerClass(不是請求處理實例)。服務(wù)器類基類的構(gòu)造函數(shù)如下:

class BaseServer:
 def __init__(self, server_address, RequestHandlerClass):
  """Constructor. May be extended, do not override."""
  self.server_address = server_address
  self.RequestHandlerClass = RequestHandlerClass
  self.__is_shut_down = threading.Event()
  self.__shutdown_request = False
 

后,可以構(gòu)造TCPServer、UDPServer、UnixStreamServer、UnixDatagramServer。其中,TCPServer繼承自BaseServer,UDPServer和UnixStreamServer繼承自TCPServer,UnixDatagramServer繼承自UDPServer。各個服務(wù)器類型可以根據(jù)自己的特點對基類進行擴展,例如創(chuàng)建監(jiān)聽套接字、綁定監(jiān)聽地址和端口、進行監(jiān)聽等。一旦實例化服務(wù)器對象,便可以使用服務(wù)器的方法來監(jiān)聽和處理請求。

2. 實現(xiàn)服務(wù)器

由于SocketServer模塊中定義的五種服務(wù)器類中,除了基類BaseServer和TCPServer外,其余的三個類都是直接或間接地繼承自TCPServer。因此,以下以TCPServer的實現(xiàn)過程為例進行說明。

構(gòu)造TCPServer。 構(gòu)造TCPServer時,構(gòu)造函數(shù)創(chuàng)建了一個套接字(這個套接字可以通過更改地址簇和類型用于其他服務(wù)器)用于監(jiān)聽請求。并且調(diào)用server_bind()綁定監(jiān)聽的地址和端口,調(diào)用server_activate()開始監(jiān)聽。

啟動服務(wù)器。 服務(wù)器實例化后,可以使用serve_forever()或者handle_request()來監(jiān)聽和處理請求,實現(xiàn)服務(wù)器功能。這兩個方法的具體實現(xiàn)依賴于_handle_request_noblock()方法。這個方法是BaseServer類中定義的。具體實現(xiàn)如下:

def _handle_request_noblock(self):
 """Handle one request, without blocking.
 I assume that select.select has returned that the socket is
 readable before this function was called, so there should be
 no risk of blocking in get_request().
 """
 try:
  request, client_address = self.get_request()
 except socket.error:
  return
 if self.verify_request(request, client_address):
  try:
   self.process_request(request, client_address)
  except:
   self.handle_error(request, client_address)
   self.shutdown_request(request)
 else:
  self.shutdown_request(request)

處理請求。 根據(jù)上一步驟啟動服務(wù)器后,服務(wù)器便開始監(jiān)聽請求。如果接收到請求信息,便開始處理請求。由_handle_request_noblock()可以看出有幾個函數(shù)比較重要。

get_request() ——這個函數(shù)可以在子類中重寫。在TCPServer中,該函數(shù)調(diào)用監(jiān)聽套接字的accept()方法,返回請求request和客戶端地址client_address。

verify_request(request, client_address) ——這個函數(shù)可以在子類中重寫。該函數(shù)返回True表示處理請求,返回False表示忽略請求。

process_request(request, client_address) ——這個函數(shù)可以在子類中重寫。該函數(shù)將調(diào)用finish_request()具體完成請求的處理過程,并且在處理完請求后關(guān)閉請求。

finish_request(request, client_address) ——該函數(shù)將構(gòu)造一個請求處理類的實例。請求處理類被實例化后將調(diào)用其handle()方法處理請求。

3. 進程/線程支持

SocketServer模塊中還提供了一些”mix-in”類:ForkingMixIn和ThreadingMixIn。這些類可以和服務(wù)器類混合使用,很容易改變服務(wù)器,為每個請求使用一個單獨的進程或線程。具體的服務(wù)器類有:

class ForkingUDPServer(ForkingMixIn, UDPServer)
class ForkingTCPServer(ForkingMixIn, TCPServer)
class ThreadingUDPServer(ThreadingMixIn, UDPServer)
class ThreadingTCPServer(ThreadingMixIn, TCPServer)
class ThreadingUnixStreamServer(ThreadingMixIn, UnixStreamServer)
class ThreadingUnixDatagramServer(ThreadingMixIn, UnixDatagramServer)

請求處理類

要接收到來的請求以及確定采取什么行動,其中大部分的工作都是由請求處理類完成的。請求處理類負責在套接字層之上實現(xiàn)協(xié)議。具體過程為:讀取請求、處理請求、寫回響應(yīng)。請求處理類基類中定義了3個方法,子類中需要重寫。

setup() ——為請求準備請求處理器
handle() ——對請求完成具體的工作。諸如解析到來的請求,處理數(shù)據(jù),并發(fā)回響應(yīng)等。
finish() ——清理setup()期間創(chuàng)建的所有數(shù)據(jù)

總結(jié)

以上就是本文關(guān)于Python探索之SocketServer詳解的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:Python探索之URL Dispatcher實例詳解、Bottle框架中的裝飾器類和描述符應(yīng)用詳解等,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • 淺談python正則的常用方法 覆蓋范圍70%以上

    淺談python正則的常用方法 覆蓋范圍70%以上

    這篇文章主要為大家詳細介紹了python正則的常用方法,覆蓋范圍70%以上,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • python使用pywinauto驅(qū)動微信客戶端實現(xiàn)公眾號爬蟲

    python使用pywinauto驅(qū)動微信客戶端實現(xiàn)公眾號爬蟲

    這個項目是通過pywinauto控制windows(win10)上的微信PC客戶端來實現(xiàn)公眾號文章的抓取。代碼分成server和client兩部分。server接收client抓取的微信公眾號文章,并且保存到數(shù)據(jù)庫。另外server支持簡單的搜索和導(dǎo)出功能。client通過pywinauto實現(xiàn)微信公眾號文章的抓取。
    2021-05-05
  • Python?Tkinter?Gui運行不卡頓(解決多線程解決界面卡死問題)

    Python?Tkinter?Gui運行不卡頓(解決多線程解決界面卡死問題)

    最近寫的Python代碼不知為何,總是執(zhí)行到一半卡住不動,所以下面這篇文章主要給大家介紹了關(guān)于Python?Tkinter?Gui運行不卡頓,解決多線程解決界面卡死問題的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • Python中使用第三方庫xlrd來寫入Excel文件示例

    Python中使用第三方庫xlrd來寫入Excel文件示例

    這篇文章主要介紹了Python中使用第三方庫xlrd來寫入Excel文件示例,本文講解了安裝xlwt、API介紹、使用xlwt寫入Excel文件實例,需要的朋友可以參考下
    2015-04-04
  • Pandas根據(jù)條件實現(xiàn)替換列中的值

    Pandas根據(jù)條件實現(xiàn)替換列中的值

    在使用Pandas的Python中,DataFrame列中的值可以通過使用各種內(nèi)置函數(shù)根據(jù)條件進行替換,本文主要來和大家討論在Pandas中用條件替換數(shù)據(jù)集列中的值的各種方法,希望對大家有所幫助
    2024-01-01
  • python中if和elif的區(qū)別介紹

    python中if和elif的區(qū)別介紹

    這篇文章主要介紹了python中if和elif的區(qū)別,下面文章將舉多個例子圍繞if和eli的相關(guān)資料展開內(nèi)容,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • PyCharm活動模板設(shè)置步驟實現(xiàn)

    PyCharm活動模板設(shè)置步驟實現(xiàn)

    很多情況,我們在寫代碼都會存在經(jīng)常要寫一些簡單且又重復(fù)的代碼,Pycharm中的活動模板可以把這些使用頻率很高的一些代碼打包起來設(shè)置一個快捷鍵,本文就來介紹一下如何實現(xiàn)
    2023-12-12
  • PyCharm第一次安裝及使用教程

    PyCharm第一次安裝及使用教程

    本文通過圖文并茂的形式給大家介紹PyCharm第一次安裝及使用教程,分步驟通過實際案例給大家操作演示,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • python如何派生內(nèi)置不可變類型并修改實例化行為

    python如何派生內(nèi)置不可變類型并修改實例化行為

    這篇文章主要為大家詳細介紹了python如何派生內(nèi)置不可變類型并修改實例化行為,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • 微信公眾號接入ChatGPT機器人的方法

    微信公眾號接入ChatGPT機器人的方法

    這篇文章主要介紹了微信公眾號接入ChatGPT機器人的方法,不難,總共可以分為兩步,一是在云服務(wù)器上部署自定義消息處理服務(wù),二是微信公眾號配置自己的消息處理服務(wù)器,本文給大家講解的非常詳細,需要的朋友可以參考下
    2023-02-02

最新評論