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 相关文章推荐
python通过pil模块将raw图片转换成png图片的方法
Mar 16 Python
Windows下PyMongo下载及安装教程
Apr 27 Python
Python中tell()方法的使用详解
May 24 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
Python内置函数delattr的具体用法
Nov 23 Python
TensorFlow实现非线性支持向量机的实现方法
Apr 28 Python
基于python3实现socket文件传输和校验
Jul 28 Python
python解析json串与正则匹配对比方法
Dec 20 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
Apr 16 Python
解决c++调用python中文乱码问题
Jul 29 Python
python如何提升爬虫效率
Sep 27 Python
pandas中对文本类型数据的处理小结
Nov 01 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 生成饼图 三维饼图
2009/09/28 PHP
php短域名转换为实际域名函数
2011/01/17 PHP
phpmail类发送邮件函数代码
2012/02/20 PHP
thinkPHP中验证码的简单使用方法
2015/12/26 PHP
php session的锁和并发
2016/01/22 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
摘自启点的main.js
2008/04/20 Javascript
javascript Prototype 对象扩展
2009/05/15 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
jquery Moblie入门—hello world的示例代码学习
2013/01/08 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
2015/09/11 Javascript
Angular 路由route实例代码
2016/07/12 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
微信小程序使用gitee进行版本管理
2018/09/20 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
Node.js API详解之 vm模块用法实例分析
2020/05/27 Javascript
[09:37]DOTA2卡尔工作室 英雄介绍圣堂刺客篇
2013/06/13 DOTA
用pywin32实现windows模拟鼠标及键盘动作
2014/04/22 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
对python中dict和json的区别详解
2018/12/18 Python
Django如何实现上传图片功能
2019/08/16 Python
如何使用python传入不确定个数参数
2020/02/18 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
世界上最大的折扣香水店:FragranceNet.com
2016/10/26 全球购物
《七颗钻石》教学反思
2014/02/28 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
幼儿园新生开学寄语
2015/05/27 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
总经理聘用协议书
2015/09/21 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书