最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python探索之SocketServer詳解

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

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

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

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

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

服務(wù)器類

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

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

要構(gòu)建一個(gè)服務(wù)器對(duì)象,需要向它傳遞一個(gè)地址server_address(服務(wù)器將在這個(gè)地址上監(jiān)聽請(qǐng)求),以及一個(gè)請(qǐng)求處理類RequestHandlerClass(不是請(qǐng)求處理實(shí)例)。服務(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。各個(gè)服務(wù)器類型可以根據(jù)自己的特點(diǎn)對(duì)基類進(jìn)行擴(kuò)展,例如創(chuàng)建監(jiān)聽套接字、綁定監(jiān)聽地址和端口、進(jìn)行監(jiān)聽等。一旦實(shí)例化服務(wù)器對(duì)象,便可以使用服務(wù)器的方法來監(jiān)聽和處理請(qǐng)求。

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

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

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

啟動(dòng)服務(wù)器。 服務(wù)器實(shí)例化后,可以使用serve_forever()或者h(yuǎn)andle_request()來監(jiān)聽和處理請(qǐng)求,實(shí)現(xiàn)服務(wù)器功能。這兩個(gè)方法的具體實(shí)現(xiàn)依賴于_handle_request_noblock()方法。這個(gè)方法是BaseServer類中定義的。具體實(shí)現(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)

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

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

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

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

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

3. 進(jìn)程/線程支持

SocketServer模塊中還提供了一些”mix-in”類:ForkingMixIn和ThreadingMixIn。這些類可以和服務(wù)器類混合使用,很容易改變服務(wù)器,為每個(gè)請(qǐng)求使用一個(gè)單獨(dú)的進(jìn)程或線程。具體的服務(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)

請(qǐng)求處理類

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

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

總結(jié)

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

相關(guān)文章

  • ubuntu系統(tǒng)下使用pm2設(shè)置nodejs開機(jī)自啟動(dòng)的方法

    ubuntu系統(tǒng)下使用pm2設(shè)置nodejs開機(jī)自啟動(dòng)的方法

    今天小編就為大家分享一篇ubuntu系統(tǒng)下使用pm2設(shè)置nodejs開機(jī)自啟動(dòng)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Python之PyQt6對(duì)話框的實(shí)現(xiàn)

    Python之PyQt6對(duì)話框的實(shí)現(xiàn)

    這篇文章主要介紹了Python之PyQt6對(duì)話框的實(shí)現(xiàn),文章內(nèi)容詳細(xì),簡(jiǎn)單易懂,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2023-01-01
  • Python matplotlib以日期為x軸作圖代碼實(shí)例

    Python matplotlib以日期為x軸作圖代碼實(shí)例

    這篇文章主要介紹了Python matplotlib以日期為x軸作圖代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Python OpenCV獲取視頻的方法

    Python OpenCV獲取視頻的方法

    本篇文章主要介紹了Python OpenCV獲取視頻的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • 基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語句

    基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語句

    這篇文章主要介紹了基于SQLAlchemy實(shí)現(xiàn)操作MySQL并執(zhí)行原生sql語句,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Jupyter Notebook讀入csv文件時(shí)出錯(cuò)的解決方案

    Jupyter Notebook讀入csv文件時(shí)出錯(cuò)的解決方案

    這篇文章主要介紹了Jupyter Notebook讀入csv文件時(shí)出錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python默認(rèn)參數(shù)的使用機(jī)制

    Python默認(rèn)參數(shù)的使用機(jī)制

    Python中函數(shù)的默認(rèn)參數(shù)是一種簡(jiǎn)化函數(shù)調(diào)用并增強(qiáng)靈活性的機(jī)制,默認(rèn)參數(shù)允許我們?cè)诤瘮?shù)定義時(shí)為某些參數(shù)指定默認(rèn)值,這樣在調(diào)用函數(shù)時(shí),如果不為這些參數(shù)傳值,它們將使用默認(rèn)值,從而使得函數(shù)調(diào)用變得更加簡(jiǎn)潔和靈活,感興趣的可以的了解一下
    2024-11-11
  • django中的自定義分頁器的實(shí)現(xiàn)示例

    django中的自定義分頁器的實(shí)現(xiàn)示例

    本文主要介紹了django中的自定義分頁器的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • pyqt5 設(shè)置窗口圓角及陰影的操作

    pyqt5 設(shè)置窗口圓角及陰影的操作

    這篇文章主要介紹了pyqt5 設(shè)置窗口圓角及陰影的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python神經(jīng)網(wǎng)絡(luò)slim常用函數(shù)訓(xùn)練保存模型

    python神經(jīng)網(wǎng)絡(luò)slim常用函數(shù)訓(xùn)練保存模型

    這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)使用slim函數(shù)進(jìn)行模型的訓(xùn)練及保存模型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05

最新評(píng)論

河东区| 镶黄旗| 惠东县| 乌拉特中旗| 昔阳县| 台安县| 海晏县| 宜宾市| 铁岭市| 防城港市| 鹰潭市| 新和县| 东至县| 积石山| 新兴县| 阿鲁科尔沁旗| 固镇县| 收藏| 东明县| 台湾省| 衡山县| 武汉市| 临漳县| 杭州市| 四会市| 遵义县| 特克斯县| 望奎县| 夏津县| 牡丹江市| 团风县| 城口县| 冷水江市| 米泉市| 台中市| 三都| 大洼县| 离岛区| 广安市| 增城市| 鄱阳县|