python使用SimpleXMLRPCServer實(shí)現(xiàn)簡單的rpc過程_第1頁
python使用SimpleXMLRPCServer實(shí)現(xiàn)簡單的rpc過程_第2頁
python使用SimpleXMLRPCServer實(shí)現(xiàn)簡單的rpc過程_第3頁
python使用SimpleXMLRPCServer實(shí)現(xiàn)簡單的rpc過程_第4頁
python使用SimpleXMLRPCServer實(shí)現(xiàn)簡單的rpc過程_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第python使用SimpleXMLRPCServer實(shí)現(xiàn)簡單的rpc過程目錄使用SimpleXMLRPCServer實(shí)現(xiàn)rpc模塊定義方法python與rpc服務(wù)1.什么是RPC2.xmlrp庫

使用SimpleXMLRPCServer實(shí)現(xiàn)rpc

模塊

SimpleXMLRPCServer

python標(biāo)準(zhǔn)庫中自帶的模塊,無需另外安裝

在python3中SimpleXMLRPCServer已經(jīng)被合并到xmlrpc.server

定義

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

方法

1.SimpleXMLRPCServer.register_function(function[,name])

注冊一個(gè)方法,服務(wù)

2.SimpleXMLRPCServer.register_instance(instance[,allow_dotted_names])

注冊實(shí)例一個(gè)對象在register_function注冊后則,不能再在register_instance注冊

3.SimpleXMLRPCServer.register_introspection_functions()

注冊一個(gè)反函數(shù)

4.SimpleXMLRPCServer.register_multicall_functions()

注冊復(fù)合函數(shù)

例如:

服務(wù)端

fromSimpleXMLRPCServerimportSimpleXMLRPCServer

defrespon_string(str):

return"getstring:%s"%str

if__name__=='__main__':

s=SimpleXMLRPCServer(('',8080))

s.register_function(respon_string,"get_string")

s.serve_forever()

客服端

fromxmlrpclibimportServerProxy

if__name__=='__main__':

s=ServerProxy(":8080")

prints.get_string("hello")

結(jié)果:

getstring:hello

服務(wù)端:

#coding=utf8

fromSimpleXMLRPCServerimportSimpleXMLRPCServer

fromSimpleXMLRPCServerimportSimpleXMLRPCRequestHandler

classRequestHandler(SimpleXMLRPCRequestHandler):

rpc_paths=('/RPC2',)

server=SimpleXMLRPCServer(("",8000),

requestHandler=RequestHandler)

print"startserviceon:8000"

server.register_introspection_functions()

#注冊pow,冪運(yùn)算,實(shí)際調(diào)用的是已有的算數(shù)pow()

server.register_function(pow)

defadd(x,y):

returnx+y

server.register_function(add,'add')

#注方法在xml-rpc中都是public的

classfun:

defdiv(self,x,y):

returnx//y

server.register_instance(fun())

server.serve_forever()

客服端:

可以使用下面的方法調(diào)用:

importxmlrpclib

s=xmlrpclib.ServerProxy(':8000')

prints.pow(3,5)

prints.add(3,9)

prints.div(7,3)

prints.system.listMethods()

結(jié)果:

243

12

2

[add,div,pow,system.listMethods,system.methodHelp,system.methodSignature]

register_multicall_functions實(shí)現(xiàn)復(fù)合調(diào)用,多個(gè)方法注冊到一個(gè)調(diào)用里

#coding=utf8

fromSimpleXMLRPCServerimportSimpleXMLRPCServer

server=SimpleXMLRPCServer(("",8000))

server.register_function(pow)

server.register_function(lambdax,y:x+y,'add')

server.register_multicall_functions()

server.serve_forever()

MultiCall調(diào)用復(fù)合方法

importxmlrpclib

s=xmlrpclib.ServerProxy(":8000")

prints

multi=xmlrpclib.MultiCall(s)

multi.pow(2,5)

forresponseinmulti():

printresponse

exceptError,err:

print"ERROR",err

結(jié)果:

ServerProxyfor:8000/RPC2

32

python與rpc服務(wù)

RPC

1.什么是RPC

RPC就是為解決服務(wù)之間信息交互而發(fā)明和存在的。

RPC(RemoteProcedureCall)遠(yuǎn)程過程調(diào)用,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計(jì)算機(jī)程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。

RPC采用客戶機(jī)/服務(wù)器模式。請求程序就是一個(gè)客戶機(jī),而服務(wù)提供程序就是一個(gè)服務(wù)器。

首先,客戶機(jī)調(diào)用進(jìn)程發(fā)送一個(gè)有進(jìn)程參數(shù)的調(diào)用信息到服務(wù)進(jìn)程,然后等待應(yīng)答信息。

在服務(wù)器端,進(jìn)程保持睡眠狀態(tài)直到調(diào)用信息到達(dá)為止。

當(dāng)一個(gè)調(diào)用信息到達(dá),服務(wù)器獲得進(jìn)程參數(shù),計(jì)算結(jié)果,發(fā)送答復(fù)信息

然后等待下一個(gè)調(diào)用信息,最后,客戶端調(diào)用進(jìn)程接收答復(fù)信息,獲得進(jìn)程結(jié)果,然后調(diào)用執(zhí)行繼續(xù)進(jìn)行。

RPC就是一種遠(yuǎn)程調(diào)用函數(shù)接口的方式,說白了,就是一種遠(yuǎn)程調(diào)用函數(shù)接口的方式,客戶端和服務(wù)端之間約定一種契約(函數(shù)接口),然后服務(wù)端一直等待客戶端的調(diào)用。

有點(diǎn)像平常的WEB網(wǎng)絡(luò)請求。

一種用途是在多臺服務(wù)器之間互相進(jìn)行調(diào)用。

另一個(gè)用途則在于,不同編程語言之間都支持這種方式,像Python更是內(nèi)置對其的支持,不需要額外安裝什么庫,所以可以直接在多語言的服務(wù)器之間互相進(jìn)行調(diào)用。

Socket編程就是RPC通信

2.xmlrp庫

簡單的服務(wù)端

像web請求一樣,我們需要確定供客戶端訪問的url和端口號,以及供客戶端調(diào)用的方法實(shí)現(xiàn),最后要讓我們服務(wù)器一直處于等待被訪問的狀態(tài):

rpc_server.py

fromxmlrpc.serverimportSimpleXMLRPCServer

調(diào)用函數(shù)

defrespon_string(str):

return“getstring:%s”%str

ifname==‘main':

server=SimpleXMLRPCServer((‘localhost',8888))#初始化

server.register_function(respon_string,“get_string”)#注冊get_string函數(shù)

print(“ListeningforClient”)

server.serve_forever()#保持等待調(diào)用狀態(tài)

rpc_client.py

fromxmlrpc.clientimportServerProxy

ifname==‘main':

server=ServerProxy(“http://localhost:8888”)#初始化服務(wù)器

print(server.get_string(“RPCRPC”))#調(diào)用get_string函數(shù)并傳參,調(diào)用get_string讓服務(wù)端通過res

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論