Python中實現遠程調用(RPC、RMI)簡單例子

  • A+
所屬分類:python

遠程調用使得調用遠程服務器的對象、方法的方式就和調用本地對象、方法的方式差不多,因為我們通過網絡編程把這些都隱藏起來了。遠程調用是分布式系統的基礎。

遠程調用一般分為兩種,遠程過程調用(RPC)和遠程方法調用(RMI)。

RPC

RPC屬于函數級別的遠程調用,其多是通過HTTP傳輸數據,數據形式有XML、JSON、序列化數據等。在此,用python做一個xml-rpc的示例。 先給服務器端server.py:

s是一個綁定了本地8080端口的服務器對象,register_function()方法將函數add注冊到s中。serve_forever()啟動服務器。

再給個客戶端client.py:

現在,運行server.py,然后運行client.py,client.py所在的console會輸出7。

我們用wireshark看一下這期間傳遞的數據是什么樣子的,請求的數據:

響應的數據:

好吧,言簡意賅,不做贅述。

RMI

RMI意為遠程方法調用,粒度比RPC要大,因為它的基本單位是對象。其大致思路是這樣的:創建RMI服務器對象,將實例化的某個對象以指定的服務名稱(也可以是多個對象,但是服務名稱不應相同)注冊到RMI服務器對象中,之后啟動RMI服務器。服務器等待客戶端發送的數據(包括服務名稱、函數名、參數),將處理結果返回給客戶端。 Pyro4是一個基于python的RMI實現,下面我們用Pyro4創建一個RMI服務器,請看server2.py:

uri變量是Pyro4用自己的方法為greeting_maker對象生成的uri,其中包括套接字以及為greeting_maker生成的唯一的id。這個id相當于服務名稱,當然也可以指定更易懂的服務名稱。

下面是客戶端client2.py:

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

 

weinxin
微信公眾號
掃一掃關注運維生存時間公眾號,獲取最新技術文章~

發表評論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: