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 Django(图文)
Nov 04 Python
python 调用HBase的简单实例
Dec 18 Python
Python利用ElementTree模块处理XML的方法详解
Aug 31 Python
pytorch构建网络模型的4种方法
Apr 13 Python
python实现换位加密算法的示例
Oct 14 Python
python爬虫实现中英翻译词典
Jun 25 Python
python检测服务器端口代码实例
Aug 31 Python
python 比较2张图片的相似度的方法示例
Dec 18 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 Python
如何快速理解python的垃圾回收机制
Sep 01 Python
sqlalchemy实现时间列自动更新教程
Sep 02 Python
Python3如何使用tabulate打印数据
Sep 25 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 XPath对XML文件查找及修改实现代码
2011/07/27 PHP
php微信支付之APP支付方法
2015/03/04 PHP
php实现的农历算法实例
2015/08/11 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
基于AngularJS实现的工资计算器实例
2017/06/16 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
vue 注册组件的使用详解
2018/05/05 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
Python的迭代器和生成器使用实例
2015/01/14 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
django 利用Q对象与F对象进行查询的实现
2020/05/15 Python
Python descriptor(描述符)的实现
2020/11/15 Python
python 实现aes256加密
2020/11/27 Python
解决pycharm不能自动保存在远程linux中的问题
2021/02/06 Python
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
英国鹦鹉店:Parrot Essentials
2018/12/03 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
工程造价自荐信
2013/10/09 职场文书
2014端午节活动策划方案
2014/01/27 职场文书
会议活动邀请函
2014/01/27 职场文书
大家访活动实施方案
2014/03/10 职场文书
文明寄语大全
2014/04/11 职场文书
小学安全工作汇报材料
2014/08/19 职场文书