首頁 > 軟體

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

2022-06-18 14:01:37

使用SimpleXMLRPCServer實現rpc

模組

  • SimpleXMLRPCServer

python標準庫中自帶的模組,無需另外安裝

在python3中 SimpleXMLRPCServer已經被合併到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()

  • 註冊一個反函數

4.SimpleXMLRPCServer.register_multicall_functions()

  • 註冊複合函數

例如:

伺服器端

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,冪運算,實際呼叫的是已有的算數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實現複合呼叫,多個方法註冊到一個呼叫裡

#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 就是為解決服務之間資訊互動而發明和存在的。

RPC(Remote Procedure Call)——遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協定。

RPC採用客戶機/伺服器模式。請求程式就是一個客戶機,而服務提供程式就是一個伺服器。

首先,客戶機呼叫程序傳送一個有程序引數的呼叫資訊到服務程序,然後等待應答資訊。

在伺服器端,程序保持睡眠狀態直到呼叫資訊到達為止。

當一個呼叫資訊到達,伺服器獲得程序引數,計算結果,傳送答覆資訊

然後等待下一個呼叫資訊,最後,使用者端呼叫程序接收答覆資訊,獲得程序結果,然後呼叫執行繼續進行。

RPC就是一種遠端呼叫函數介面的方式,說白了,就是一種遠端呼叫函數介面的方式,使用者端和伺服器端之間約定一種契約(函數介面),然後伺服器端一直等待使用者端的呼叫。

有點像平常的WEB網路請求。

一種用途是在多臺伺服器之間互相進行呼叫。

另一個用途則在於,不同程式語言之間都支援這種方式,像Python更是內建對其的支援,不需要額外安裝什麼庫,所以可以直接在多語言的伺服器之間互相進行呼叫。

Socket程式設計就是RPC通訊

2.xmlrp庫

簡單的伺服器端

像web請求一樣,我們需要確定供使用者端存取的url和埠號,以及供使用者端呼叫的方法實現,最後要讓我們伺服器一直處於等待被存取的狀態:

rpc_server.py
from xmlrpc.server import SimpleXMLRPCServer

呼叫函數

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函數處理請求,並返回。

操作

#伺服器端啟動:
[root@xujunk tmp]#python3 rpc_server.py
Listening for Client
#使用者端啟動:
[root@xujunk tmp]#python3 rpc_client.py
get string:RPC RPC #返回結果

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com