• <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,再見(jiàn)!高德

            https://github.com/adoggie

              C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
              246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

            常用鏈接

            留言簿(54)

            我參與的團(tuán)隊(duì)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            緣于要做個(gè)http代理服務(wù)器的需求,開(kāi)始琢磨SocketServer類,看看其有多優(yōu)秀

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

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

            ThreadingMixIn: 線程模型
               process_request( request, client_address) 為請(qǐng)求的鏈接創(chuàng)建新的線程,在創(chuàng)建線程時(shí)直接指定線程入口和參數(shù):
                  
            import threading
            = threading.Thread(target = self.process_request_thread,
                 args 
            = (request, client_address))
            if self.daemon_threads:
              t.setDaemon (
            1)
               process_request_thread() 線程處理socket入口,負(fù)責(zé)接收數(shù)據(jù),代碼實(shí)現(xiàn)有點(diǎn)繞,看看代碼
            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其實(shí)就是線程代理,還是調(diào)用finish_request()進(jìn)入處理tcp數(shù)據(jù)的循環(huán),處理完成便close_request()。但是finish_request和close_request并未在ThreadingMinxIn內(nèi)定義,在哪里呢? 通過(guò)研讀ThreadingTcpServer,原來(lái)通過(guò)ThreadingTcpServer這個(gè)finish_request又跑回了BaseServer.finish_request()

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

            BaseRequestHandler:  請(qǐng)求處理基礎(chǔ)對(duì)象,提供統(tǒng)一的行為接口實(shí)現(xiàn)處理socket數(shù)據(jù)。 BaseRequestHandler比較好玩,在構(gòu)造函數(shù)內(nèi)完成了所有的操作,見(jiàn)代碼:
            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()對(duì)應(yīng)的子類會(huì)進(jìn)行初始化處理
               self.handle()  直接調(diào)用子類的處理函數(shù),可以參考 BaseHTTPRequestHandler(SocketServer.StreamRequestHandler)::handle()


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


            HTTPServer(SocketServer.TCPServer) http服務(wù)器

            BaseHTTPRequestHandler(SocketServer.StreamRequestHandler) 流式的請(qǐng)求處理類
               handle() 處理入口,在基類BaseRequestHandle()的構(gòu)造函數(shù)中直接調(diào)用
               handle_one_request() 如果不是處理一次則返回false。接收一次socket數(shù)據(jù),解析parse_request(),調(diào)用對(duì)應(yīng)的do_xxx事件

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

            posted on 2010-02-15 23:42 放屁阿狗 閱讀(4788) 評(píng)論(0)  編輯 收藏 引用 所屬分類: perl/python/php/lua/tclWebService
            国内精品久久久久影院日本| 亚洲欧美国产精品专区久久| 91久久婷婷国产综合精品青草| 狠狠色丁香婷婷久久综合不卡| 亚洲国产成人久久综合一| 久久精品国产色蜜蜜麻豆| 亚洲精品tv久久久久| 久久精品国产网红主播| 青青久久精品国产免费看 | 伊人色综合久久天天人手人婷| 狠狠88综合久久久久综合网 | 色综合久久综精品| 无码国内精品久久综合88| 99久久精品免费看国产| 亚洲国产精品无码久久SM| 久久有码中文字幕| 久久久精品午夜免费不卡| 久久久亚洲AV波多野结衣| 精品久久久久久无码中文字幕| 狠狠色丁香久久婷婷综合五月| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久福利青草精品资源站| 国产成人久久精品一区二区三区 | 久久精品国产72国产精福利| 精品国际久久久久999波多野| 亚洲精品美女久久久久99小说| 久久精品国产久精国产| 日韩精品久久久久久免费| 伊人情人综合成人久久网小说| 国产高潮久久免费观看| 日韩欧美亚洲综合久久影院d3| 久久久久国产精品嫩草影院| 亚洲国产成人久久综合区| 精品久久久久久99人妻| 国产精品欧美久久久久天天影视| 国产一级做a爰片久久毛片| 久久婷婷成人综合色综合| 久久婷婷五月综合97色一本一本 | 人人狠狠综合久久亚洲高清| 伊人久久大香线蕉影院95| 国产精品免费久久久久影院|