Python中实现远程调用(RPC、RMI)简单例子


Posted in Python onApril 28, 2014

远程调用使得调用远程服务器的对象、方法的方式就和调用本地对象、方法的方式差不多,因为我们通过网络编程把这些都隐藏起来了。远程调用是分布式系统的基础。

远程调用一般分为两种,远程过程调用(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>
    </params>
</methodResponse>

好吧,言简意赅,不做赘述。

RMI

RMI意为远程方法调用,粒度比RPC要大,因为它的基本单位是对象。其大致思路是这样的:创建RMI服务器对象,将实例化的某个对象以指定的服务名称(也可以是多个对象,但是服务名称不应相同)注册到RMI服务器对象中,之后启动RMI服务器。服务器等待客户端发送的数据(包括服务名称、函数名、参数),将处理结果返回给客户端。 Pyro4是一个基于python的RMI实现,下面我们用Pyro4创建一个RMI服务器,请看server2.py:

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对象生成的uri,其中包括套接字以及为greeting_maker生成的唯一的id。这个id相当于服务名称,当然也可以指定更易懂的服务名称。下面是客户端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。通过给Pyro4.Proxy传递greeting_maker的uri,可以认为和服务器端的greeting_maker建立的连接,然后调用greeting_maker的get_fortune()方法。如果name是letian,那么print greeting_maker.get_fortune(name)的结果是Hello, letian.。
Python 相关文章推荐
django模型中的字段和model名显示为中文小技巧分享
Nov 18 Python
详解Python中列表和元祖的使用方法
Apr 25 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
Jun 24 Python
Python每天必学之bytes字节
Jan 28 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
python入门教程之识别验证码
Mar 04 Python
如何通过python画loss曲线的方法
Jun 26 Python
python二元表达式用法
Dec 04 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
使用numpy nonzero 找出非0元素
May 14 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 Python
Python中的 enumerate和zip详情
May 30 Python
Python的ORM框架SQLObject入门实例
Apr 28 #Python
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 #Python
python监控网卡流量并使用graphite绘图的示例
Apr 27 #Python
python抓取网页图片示例(python爬虫)
Apr 27 #Python
python实现sublime3的less编译插件示例
Apr 27 #Python
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
Apr 26 #Python
Python设计模式之单例模式实例
Apr 26 #Python
You might like
通过PHP的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
使用ThinkPHP+Uploadify实现图片上传功能
2014/06/26 PHP
jQuery中文入门指南,翻译加实例,jQuery的起点教程
2007/02/09 Javascript
javascript prototype,executing,context,closure
2008/12/24 Javascript
关于jQuery新的事件绑定机制on()的使用技巧
2013/04/26 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形网络(1)
2015/11/30 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
Angular ng-repeat指令实例以及扩展部分
2016/12/26 Javascript
node 利用进程通信实现Cluster共享内存
2017/10/27 Javascript
详解angularjs跨页面传参遇到的一些问题
2018/11/01 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
[02:17]TI4西雅图DOTA2前线报道 啸天mik夫妻档解说
2014/07/08 DOTA
python爬虫教程之爬取百度贴吧并下载的示例
2014/03/07 Python
利用Python3分析sitemap.xml并抓取导出全站链接详解
2017/07/04 Python
django表单的Widgets使用详解
2019/07/22 Python
Pandas透视表(pivot_table)详解
2019/07/22 Python
pycharm创建scrapy项目教程及遇到的坑解析
2019/08/15 Python
Python爬虫解析网页的4种方式实例及原理解析
2019/12/30 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
python下载的库包存放路径
2020/07/27 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
巴西食品补充剂在线零售商:Músculos na Web
2017/08/07 全球购物
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
网络工程专业毕业生推荐信
2013/10/28 职场文书
士力架广告词
2014/03/20 职场文书
秘书英文求职信
2014/04/16 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
python - timeit 时间模块
2021/04/06 Python
java设计模式--建造者模式详解
2021/07/21 Java/Android
Nginx跨域问题解析与解决
2022/08/05 Servers