python使用SimpleXMLRPCServer實現(xiàn)簡單的rpc過程
使用SimpleXMLRPCServer實現(xiàn)rpc
模塊
SimpleXMLRPCServer
python標準庫中自帶的模塊,無需另外安裝
在python3中 SimpleXMLRPCServer已經(jīng)被合并到xmlrpc.server
定義
class SimpleXMLRPCServer.SimpleXMLRPCServer(addr[, requestHandler[, logRequests[, allow_none[, encoding[, bind_and_activate]]]])
方法
1.SimpleXMLRPCServer.register_function(function[, name])
- 注冊一個方法,服務
2.SimpleXMLRPCServer.register_instance(instance[, allow_dotted_names])
- 注冊實例
- 一個對象在register_function注冊后則,不能再在register_instance注冊
3.SimpleXMLRPCServer.register_introspection_functions()
- 注冊一個反函數(shù)
4.SimpleXMLRPCServer.register_multicall_functions()
- 注冊復合函數(shù)
例如:
服務端
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()
客服端
from xmlrpclib import ServerProxy if __name__ == '__main__': ? ? s = ServerProxy("http://192.168.137.9:8080") ? ? print s.get_string("hello")?
結果:
# python get.py
get string :hello
服務端:
#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,冪運算,實際調用的是已有的算數(shù)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()
客服端:
可以使用下面的方法調用:
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()
結果:
243
12
2
['add', 'div', 'pow', 'system.listMethods', 'system.methodHelp', 'system.methodSignature']
register_multicall_functions實現(xiàn)復合調用,多個方法注冊到一個調用里
#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調用復合方法
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 ??
結果:
# python jm.py
<ServerProxy for 192.168.137.9:8000/RPC2>
32
python與rpc服務
RPC
1.什么是RPC
RPC 就是為解決服務之間信息交互而發(fā)明和存在的。
RPC(Remote Procedure Call)——遠程過程調用,它是一種通過網(wǎng)絡從遠程計算機程序上請求服務,而不需要了解底層網(wǎng)絡技術的協(xié)議。
RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。
首先,客戶機調用進程發(fā)送一個有進程參數(shù)的調用信息到服務進程,然后等待應答信息。
在服務器端,進程保持睡眠狀態(tài)直到調用信息到達為止。
當一個調用信息到達,服務器獲得進程參數(shù),計算結果,發(fā)送答復信息
然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執(zhí)行繼續(xù)進行。
RPC就是一種遠程調用函數(shù)接口的方式,說白了,就是一種遠程調用函數(shù)接口的方式,客戶端和服務端之間約定一種契約(函數(shù)接口),然后服務端一直等待客戶端的調用。
有點像平常的WEB網(wǎng)絡請求。
一種用途是在多臺服務器之間互相進行調用。
另一個用途則在于,不同編程語言之間都支持這種方式,像Python更是內置對其的支持,不需要額外安裝什么庫,所以可以直接在多語言的服務器之間互相進行調用。
Socket編程就是RPC通信
2.xmlrp庫
簡單的服務端
像web請求一樣,我們需要確定供客戶端訪問的url和端口號,以及供客戶端調用的方法實現(xiàn),最后要讓我們服務器一直處于等待被訪問的狀態(tài):
rpc_server.py from xmlrpc.server import SimpleXMLRPCServer
調用函數(shù)
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函數(shù) print (“Listening for Client”) server.serve_forever() # 保持等待調用狀態(tài) rpc_client.py from xmlrpc.client import ServerProxy if name == ‘main': server = ServerProxy(“http://localhost:8888”) # 初始化服務器 print (server.get_string(“RPC RPC”)) # 調用get_string函數(shù)并傳參,調用get_string讓服務端通過respon_string函數(shù)處理請求,并返回。
操作
#服務端啟動: [root@xujunk tmp]#python3 rpc_server.py Listening for Client #客戶端啟動: [root@xujunk tmp]#python3 rpc_client.py get string:RPC RPC #返回結果
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
python不到50行代碼完成了多張excel合并的實現(xiàn)示例
這篇文章主要介紹了python不到50行代碼完成了多張excel合并的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-05-05Python統(tǒng)計字符內容的占比的實現(xiàn)
本文介紹了如何使用Python統(tǒng)計字符占比,包括字符串中字母、數(shù)字、空格等字符的占比,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08利用python模擬實現(xiàn)POST請求提交圖片的方法
最近在利用python做接口測試,其中有個上傳圖片的接口,在網(wǎng)上各種搜索,各種嘗試。下面這篇文章主要給大家介紹了關于利用python模擬實現(xiàn)POST請求提交圖片的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-07-07YOLOv5部署到web端詳細過程(flask+js簡單易懂)
YOLOv5是一個目標檢測模型,Flask是一個Python的Web框架,下面這篇文章主要給大家介紹了關于YOLOv5部署到web端(flask+js簡單易懂)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-04-04