国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

Python中實(shí)現(xiàn)遠(yuǎn)程調(diào)用(RPC、RMI)簡(jiǎn)單例子

2019-11-25 18:25:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

遠(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è)客戶端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ù)名稱(也可以是多個(gè)對(duì)象,但是服務(wù)名稱不應(yīng)相同)注冊(cè)到RMI服務(wù)器對(duì)象中,之后啟動(dòng)RMI服務(wù)器。服務(wù)器等待客戶端發(fā)送的數(shù)據(jù)(包括服務(wù)名稱、函數(shù)名、參數(shù)),將處理結(jié)果返回給客戶端。 Pyro4是一個(gè)基于python的RMI實(shí)現(xiàn),下面我們用Pyro4創(chuàng)建一個(gè)RMI服務(wù)器,請(qǐng)看server2.py:

復(fù)制代碼 代碼如下:

import Pyro4
class GreetingMaker(object):
    def get_fortune(self, name):
        return "Hello, {0}. /n" .format(name)
greeting_maker=GreetingMaker()
daemon=Pyro4.Daemon()               
uri=daemon.register(greeting_maker)  
print "Ready. Object uri =", uri     
daemon.requestLoop()
uri變量是Pyro4用自己的方法為greeting_maker對(duì)象生成的uri,其中包括套接字以及為greeting_maker生成的唯一的id。這個(gè)id相當(dāng)于服務(wù)名稱,當(dāng)然也可以指定更易懂的服務(wù)名稱。下面是客戶端client2.py:

import Pyro4
uri=raw_input(" Pyro uri : ").strip()
name=raw_input("Your name: ").strip()
greeting_maker=Pyro4.Proxy(uri)       
print greeting_maker.get_fortune(name)


這其中要輸入的uri也就是server2.py生成的uri。通過(guò)給Pyro4.Proxy傳遞greeting_maker的uri,可以認(rèn)為和服務(wù)器端的greeting_maker建立的連接,然后調(diào)用greeting_maker的get_fortune()方法。如果name是letian,那么print greeting_maker.get_fortune(name)的結(jié)果是Hello, letian.。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 富源县| 九江市| 平乐县| 舟山市| 读书| 台南市| 吐鲁番市| 抚远县| 铜川市| 灌阳县| 孟村| 边坝县| 黎城县| 铅山县| 油尖旺区| 开封市| 宜丰县| 邵东县| 澎湖县| 安新县| 运城市| 开原市| 土默特左旗| 奉新县| 台南市| 青田县| 黔东| 阜宁县| 扎赉特旗| 赞皇县| 来安县| 道孚县| 繁昌县| 奈曼旗| 宜黄县| 且末县| 锦屏县| 安仁县| 沂源县| 璧山县| 虹口区|