遠程調用使得調用遠程服務器的對象、方法的方式就和調用本地對象、方法的方式差不多,因為我們通過網絡編程把這些都隱藏起來了。遠程調用是分布式系統的基礎。
遠程調用一般分為兩種,遠程過程調用(RPC)和遠程方法調用(RMI)。
RPC
RPC屬于函數級別的遠程調用,其多是通過HTTP傳輸數據,數據形式有XML、JSON、序列化數據等。在此,用python做一個xml-rpc的示例。 先給服務器端server.py:
代碼如下:
from SimpleXMLRPCServer import SimpleXMLRPCServer
def add(x, y):
return x + y
if __name__ == '__main__':
s = SimpleXMLRPCServer(('127.0.0.1', 8080))
s.register_function(add)
s.serve_forever()
s是一個綁定了本地8080端口的服務器對象,register_function()方法將函數add注冊到s中。serve_forever()啟動服務器。 再給個客戶端client.py:
from xmlrpclib import ServerProxy
if __name__ == '__main__':
s = ServerProxy("http://127.0.0.1:8080")
print s.add(3,4)
現在,運行server.py,然后運行client.py,client.py所在的console會輸出7。
我們用wireshark看一下這期間傳遞的數據是什么樣子的,請求的數據:
代碼如下:
<?xml version='1.0' ?>
<methodCall>
<methodName>
add
</methodName>
<params>
<param>
<value>
<int> 3 </int>
</value>
</param>
<param>
<value>
<int> 4 </int>
</value>
</param>
</params>
</methodCall>
響應的數據:
代碼如下:
<?xml version='1.0' ?>
<methodResponse>
<params>
<param>
<value>
<int> 7 </int>
</value>
</param>
新聞熱點
疑難解答