• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            socketref,再見!高德

            https://github.com/adoggie

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(54)

            我參與的團隊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            緣于要做個http代理服務器的需求,開始琢磨SocketServer類,看看其有多優秀

            BaseServer: 定義基礎服務器接口,這些功能接口提供給子類繼承。同時提供服務處理的骨架
               serve_forever()  循環調用 handle_request()
               handle_request()  調用子類的get_request() ,在tcpServer時實則進行accept()應答; 驗證處理 verify_request(); 
                         最終處理請求 process_request(),
               verify_request()   虛函數
               process_request()  虛函數,這個函數并沒有直接在BaseServer的子類TcpServer中被重載,而是在TcpServer的派生類中通過另一個父類來實
            現,比如 ThreadingTCPServer的基類ThreadingMixIn.process_request()實現了此功能函數
               finish_request(request, client_address) 執行一次完整的socket數據讀入處理,如果是ThreadMixInTcpServer產生的request,這個方法內必須實行循環讀取socket數據,直到socket關閉。(此處 request 就是 socket對象)
             def finish_request(self, request, client_address):
                    
            """Finish one request by instantiating RequestHandlerClass."""
                    self.RequestHandlerClass(request, client_address, self)
               在finish_request里面便將讀取socket數據的任務扔給了RequestHandler去處理了,代碼可以跳過去看了
            ##---------------------------------------------

            TcpServer:  tcp服務器
               __init__(self, server_address, RequestHandlerClass) 需要提供服務偵聽地址和請求處理類對象
               server_bind() 綁定服務器地址
               server_activate() 激活服務器
               server_close()  關閉服務器
               fileno()  返回服務器socket的句柄fd編號
               get_request() 接收應答accept()
               close_request(request) 關閉socket,request即為socket對象
             
            三種輸出處理方式: 阻塞方式、線程處理(ThreadingMixIn)、進程處理(ForkingMixIn)

            ThreadingMixIn: 線程模型
               process_request( request, client_address) 為請求的鏈接創建新的線程,在創建線程時直接指定線程入口和參數:
                  
            import threading
            = threading.Thread(target = self.process_request_thread,
                 args 
            = (request, client_address))
            if self.daemon_threads:
              t.setDaemon (
            1)
               process_request_thread() 線程處理socket入口,負責接收數據,代碼實現有點繞,看看代碼
            def process_request_thread(self, request, client_address):
                    
            try:
                        self.finish_request(request, client_address)
                        self.close_request(request)
                    
            except:
                        self.handle_error(request, client_address)
                        self.close_request(request)
                ThreadingMixIn其實就是線程代理,還是調用finish_request()進入處理tcp數據的循環,處理完成便close_request()。但是finish_request和close_request并未在ThreadingMinxIn內定義,在哪里呢? 通過研讀ThreadingTcpServer,原來通過ThreadingTcpServer這個finish_request又跑回了BaseServer.finish_request()

            ThreadingTCPServer(ThreadingMixIn, TCPServer) 裝配成線程池處理的tcp服務器
              

            BaseRequestHandler:  請求處理基礎對象,提供統一的行為接口實現處理socket數據。 BaseRequestHandler比較好玩,在構造函數內完成了所有的操作,見代碼:
            def __init__(self, request, client_address, server):
                    self.request 
            = request
                    self.client_address 
            = client_address
                    self.server 
            = server
                    
            try:
                        self.setup()
                        self.handle()
                        self.finish()
                    
            finally:
                        sys.exc_traceback 
            = None    # Help garbage collection
               setup()對應的子類會進行初始化處理
               self.handle()  直接調用子類的處理函數,可以參考 BaseHTTPRequestHandler(SocketServer.StreamRequestHandler)::handle()


            StreamRequestHandler(BaseRequestHandler) 流式socket處理類
               setup() 設置好socket對象和讀寫文件句柄 rfile/wfile


            HTTPServer(SocketServer.TCPServer) http服務器

            BaseHTTPRequestHandler(SocketServer.StreamRequestHandler) 流式的請求處理類
               handle() 處理入口,在基類BaseRequestHandle()的構造函數中直接調用
               handle_one_request() 如果不是處理一次則返回false。接收一次socket數據,解析parse_request(),調用對應的do_xxx事件

            python 的daemon線程:
            如果一個進程的主線程運行完畢而子線程還在執行的話,那么進程就不會退出,直到所有子線程結束為止,如何讓主線程結束的時候其他子線程也乖乖的跟老大撤退呢?那就要把那些不聽話的人設置為聽話的小弟,使用線程對象的setDaemon()方法,參數為bool型。True的話就代表你要聽話,我老大(主線程)扯呼,你也要跟著撤,不能拖后腿。如果是False的話就不用那么聽話了,老大允許你們將在外軍命有所不受的。需要注意的是setDaemon()方法必須在線程對象沒有調用start()方法之前調用,否則沒效果。
              

            posted on 2010-02-15 23:42 放屁阿狗 閱讀(4775) 評論(0)  編輯 收藏 引用 所屬分類: perl/python/php/lua/tclWebService
            亚洲午夜久久久久妓女影院| 五月丁香综合激情六月久久| 国产V综合V亚洲欧美久久| 久久久这里有精品| 精品久久久久久无码人妻热| 国产亚洲婷婷香蕉久久精品| 久久精品国产99久久无毒不卡| 亚洲AV无码一区东京热久久| 亚洲精品无码久久久久久| 亚洲综合精品香蕉久久网| 国产香蕉久久精品综合网| 亚洲伊人久久成综合人影院 | 伊人久久综合热线大杳蕉下载| 精品国产VA久久久久久久冰 | 亚洲国产精品无码久久久不卡| 狠狠综合久久综合88亚洲| 亚洲va中文字幕无码久久| 性欧美大战久久久久久久久| 久久精品国产亚洲AV无码娇色| 97久久精品人妻人人搡人人玩| 狠色狠色狠狠色综合久久| 品成人欧美大片久久国产欧美| 青青草原1769久久免费播放| 久久久久亚洲AV综合波多野结衣| 三级韩国一区久久二区综合| 久久久精品人妻一区二区三区蜜桃 | 久久精品国产亚洲av高清漫画 | 99久久精品这里只有精品| 国产免费福利体检区久久| 色欲综合久久躁天天躁| 欧美国产成人久久精品| 久久精品国产亚洲av麻豆色欲| 日本精品久久久中文字幕| 思思久久好好热精品国产| 久久青青草原亚洲av无码app | 波多野结衣久久| 色欲久久久天天天综合网精品| 国产成人久久精品区一区二区| 久久久久国产精品嫩草影院 | 久久这里只有精品久久| 午夜精品久久久久9999高清|