遠(yuǎn)程調(diào)用使得調(diào)用遠(yuǎn)程服務(wù)器的對(duì)象、方法的方式就和調(diào)用本地對(duì)象、方法的方式差不多,因?yàn)槲覀兺ㄟ^(guò)網(wǎng)絡(luò)編程把這些都隱藏起來(lái)了。遠(yuǎn)程調(diào)用是分布式系統(tǒng)的基礎(chǔ)。
遠(yuǎn)程調(diào)用一般分為兩種,遠(yuǎn)程過(guò)程調(diào)用(RPC)和遠(yuǎn)程方法調(diào)用(RMI)。
RPC
RPC屬于函數(shù)級(jí)別的遠(yuǎn)程調(diào)用,其多是通過(guò)HTTP傳輸數(shù)據(jù),數(shù)據(jù)形式有XML、JSON、序列化數(shù)據(jù)等。在此,用python做一個(gè)xml-rpc的示例。 先給服務(wù)器端server.py:
復(fù)制代碼 代碼如下:
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是一個(gè)綁定了本地8080端口的服務(wù)器對(duì)象,register_function()方法將函數(shù)add注冊(cè)到s中。serve_forever()啟動(dòng)服務(wù)器。 再給個(gè)客戶(hù)端client.py:
from xmlrpclib import ServerProxy
if __name__ == '__main__':
s = ServerProxy("http://127.0.0.1:8080")
print s.add(3,4)
現(xiàn)在,運(yùn)行server.py,然后運(yùn)行client.py,client.py所在的console會(huì)輸出7。
我們用wireshark看一下這期間傳遞的數(shù)據(jù)是什么樣子的,請(qǐng)求的數(shù)據(jù):
復(fù)制代碼 代碼如下:
<?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>
響應(yīng)的數(shù)據(jù):
復(fù)制代碼 代碼如下:
<?xml version='1.0' ?>
<methodResponse>
<params>
<param>
<value>
<int> 7 </int>
</value>
</param>
</params>
</methodResponse>
好吧,言簡(jiǎn)意賅,不做贅述。
RMI
RMI意為遠(yuǎn)程方法調(diào)用,粒度比RPC要大,因?yàn)樗幕締挝皇菍?duì)象。其大致思路是這樣的:創(chuàng)建RMI服務(wù)器對(duì)象,將實(shí)例化的某個(gè)對(duì)象以指定的服務(wù)名稱(chēng)(也可以是多個(gè)對(duì)象,但是服務(wù)名稱(chēng)不應(yīng)相同)注冊(cè)到RMI服務(wù)器對(duì)象中,之后啟動(dòng)RMI服務(wù)器。服務(wù)器等待客戶(hù)端發(fā)送的數(shù)據(jù)(包括服務(wù)名稱(chēng)、函數(shù)名、參數(shù)),將處理結(jié)果返回給客戶(hù)端。 Pyro4是一個(gè)基于python的RMI實(shí)現(xiàn),下面我們用Pyro4創(chuàng)建一個(gè)RMI服務(wù)器,請(qǐng)看server2.py:
新聞熱點(diǎn)
疑難解答
圖片精選