您的位置:首頁 > 教程 > python > python使用SimpleXMLRPCServer實現簡單的rpc過程

python使用SimpleXMLRPCServer實現簡單的rpc過程

2022-06-18 12:03:07 來源:易采站長站 作者:

python使用SimpleXMLRPCServer實現簡單的rpc過程

目錄
使用SimpleXMLRPCServer實現rpc模塊定義方法python與rpc服務1.什么是RPC2.xmlrp庫

toU站長之家-易采站長站-Easck.Com

使用SimpleXMLRPCServer實現rpc

toU站長之家-易采站長站-Easck.Com

模塊

    SimpleXMLRPCServer

    python標準庫中自帶的模塊,無需另外安裝toU站長之家-易采站長站-Easck.Com

    在python3中>

    toU站長之家-易采站長站-Easck.Com

    定義

    class SimpleXMLRPCServer.SimpleXMLRPCServer(addr[, requestHandler[, logRequests[, allow_none[, encoding[, bind_and_activate]]]])

    toU站長之家-易采站長站-Easck.Com

    方法

    1.SimpleXMLRPCServer.register_function(function[,>

      注冊一個方法,服務

      2.SimpleXMLRPCServer.register_instance(instance[, allow_dotted_names])toU站長之家-易采站長站-Easck.Com

        注冊實例一個對象在register_function注冊后則,不能再在register_instance注冊

        3.SimpleXMLRPCServer.register_introspection_functions()toU站長之家-易采站長站-Easck.Com

          注冊一個反函數

          4.SimpleXMLRPCServer.register_multicall_functions()toU站長之家-易采站長站-Easck.Com

            注冊復合函數

            例如:toU站長之家-易采站長站-Easck.Com

            服務端toU站長之家-易采站長站-Easck.Com

            from SimpleXMLRPCServer import SimpleXMLRPCServer ??
            def respon_string(str):
            ? ? return "get string :%s"%str
            
            if __name__ == '__main__':
            ? ? s = SimpleXMLRPCServer(('0.0.0.0', 8080))
            ? ? s.register_function(respon_string,"get_string")
            ? ? s.serve_forever()

            客服端toU站長之家-易采站長站-Easck.Com

            from xmlrpclib import ServerProxy
            if __name__ == '__main__':
            ? ? s = ServerProxy("http://192.168.137.9:8080")
            ? ? print s.get_string("hello")?

            結果:toU站長之家-易采站長站-Easck.Com

            # python get.py toU站長之家-易采站長站-Easck.Com
            get string :hellotoU站長之家-易采站長站-Easck.Com

            服務端:toU站長之家-易采站長站-Easck.Com

            #coding=utf8
            from SimpleXMLRPCServer import SimpleXMLRPCServer
            from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
            
            class RequestHandler(SimpleXMLRPCRequestHandler):
            ? ? rpc_paths = ('/RPC2',)
            server = SimpleXMLRPCServer(("0.0.0.0", 8000),
            ? ? ? ? ? ? ? ? ? ? ? ? ? ? requestHandler=RequestHandler)
            
            print "start service on 0.0.0.0:8000" ? ? ? ? ? ? ? ? ? ? ? ? ? ?
            server.register_introspection_functions()
            
            #注冊pow,冪運算,實際調用的是已有的算數pow()
            server.register_function(pow)
            
            def add(x,y):
            ? ? return x + y
            server.register_function(add, 'add')
            
            #注方法在xml-rpc中都是public的
            
            class fun:
            ? ? def div(self, x, y):
            ? ? ? ? return x // y
            
            server.register_instance(fun())
            server.serve_forever()

            客服端:toU站長之家-易采站長站-Easck.Com

            可以使用下面的方法調用:toU站長之家-易采站長站-Easck.Com

            import xmlrpclib
            
            s = xmlrpclib.ServerProxy('http://192.168.137.9:8000')
            print s.pow(3,5)?
            print s.add(3,9)?
            print s.div(7,3)?
            
            print s.system.listMethods()

            結果:toU站長之家-易采站長站-Easck.Com

            243toU站長之家-易采站長站-Easck.Com
            12toU站長之家-易采站長站-Easck.Com
            2toU站長之家-易采站長站-Easck.Com
            ['add', 'div', 'pow', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']toU站長之家-易采站長站-Easck.Com

            register_multicall_functions實現復合調用,多個方法注冊到一個調用里toU站長之家-易采站長站-Easck.Com

            #coding=utf8
            
            from SimpleXMLRPCServer import SimpleXMLRPCServer
            
            server = SimpleXMLRPCServer(("0.0.0.0", 8000))
            server.register_function(pow)
            server.register_function(lambda x,y: x+y, 'add')
            server.register_multicall_functions()
            server.serve_forever()

            MultiCall調用復合方法toU站長之家-易采站長站-Easck.Com

            import xmlrpclib
            s = xmlrpclib.ServerProxy("http://192.168.137.9:8000")
            print s
            multi = xmlrpclib.MultiCall(s)
            multi.pow(2, 5)
            try:
            ? ? for response in multi():
            ? ? ? ? print response
            except Error, err:
            ? ? print "ERROR", err ??

            結果:toU站長之家-易采站長站-Easck.Com

            # python jm.py toU站長之家-易采站長站-Easck.Com
            <ServerProxy for 192.168.137.9:8000/RPC2>toU站長之家-易采站長站-Easck.Com
            32toU站長之家-易采站長站-Easck.Com

            toU站長之家-易采站長站-Easck.Com

            python與rpc服務

            RPCtoU站長之家-易采站長站-Easck.Com

            toU站長之家-易采站長站-Easck.Com

            1.什么是RPC

            RPC>

            RPC(Remote Procedure Call)——遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。toU站長之家-易采站長站-Easck.Com

            RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。toU站長之家-易采站長站-Easck.Com

            首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。toU站長之家-易采站長站-Easck.Com

            在服務器端,進程保持睡眠狀態直到調用信息到達為止。toU站長之家-易采站長站-Easck.Com

            當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息toU站長之家-易采站長站-Easck.Com

            然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。toU站長之家-易采站長站-Easck.Com

            RPC就是一種遠程調用函數接口的方式,說白了,就是一種遠程調用函數接口的方式,客戶端和服務端之間約定一種契約(函數接口),然后服務端一直等待客戶端的調用。toU站長之家-易采站長站-Easck.Com

            有點像平常的WEB網絡請求。toU站長之家-易采站長站-Easck.Com

            一種用途是在多臺服務器之間互相進行調用。toU站長之家-易采站長站-Easck.Com

            另一個用途則在于,不同編程語言之間都支持這種方式,像Python更是內置對其的支持,不需要額外安裝什么庫,所以可以直接在多語言的服務器之間互相進行調用。toU站長之家-易采站長站-Easck.Com

            Socket編程就是RPC通信toU站長之家-易采站長站-Easck.Com

            toU站長之家-易采站長站-Easck.Com

            2.xmlrp庫

            簡單的服務端toU站長之家-易采站長站-Easck.Com

            像web請求一樣,我們需要確定供客戶端訪問的url和端口號,以及供客戶端調用的方法實現,最后要讓我們服務器一直處于等待被訪問的狀態:toU站長之家-易采站長站-Easck.Com

            rpc_server.py
            from xmlrpc.server import SimpleXMLRPCServer

            調用函數toU站長之家-易采站長站-Easck.Com

            def respon_string(str):
            return “get string:%s”%str
            
            if name == ‘main':
            server = SimpleXMLRPCServer((‘localhost', 8888)) # 初始化
            server.register_function(respon_string, “get_string”) # 注冊get_string函數
            print (“Listening for Client”)
            server.serve_forever() # 保持等待調用狀態
            rpc_client.py
            from xmlrpc.client import ServerProxy
            
            if name == ‘main':
            server = ServerProxy(“http://localhost:8888”) # 初始化服務器
            print (server.get_string(“RPC RPC”)) # 調用get_string函數并傳參,調用get_string讓服務端通過respon_string函數處理請求,并返回。

            操作toU站長之家-易采站長站-Easck.Com

            #服務端啟動:
            [root@xujunk tmp]#python3 rpc_server.py
            Listening for Client
            #客戶端啟動:
            [root@xujunk tmp]#python3 rpc_client.py
            get string:RPC RPC #返回結果

            以上為個人經驗,希望能給大家一個參考,也希望大家多多支持易采站長站。toU站長之家-易采站長站-Easck.Com

            如有侵權,請聯系QQ:279390809 電話:15144810328

相關文章

色七七影院_香港三级台湾三级在线播放_男人放进女人阳道猛进猛出