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常用列表数据结构小结
Aug 06 Python
python爬虫常用的模块分析
Aug 29 Python
Python简单的制作图片验证码实例
May 31 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
Jun 24 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
用Python PIL实现几个简单的图片特效
Jan 18 Python
python2.7 安装pip的方法步骤(管用)
May 05 Python
python格式化输出保留2位小数的实现方法
Jul 02 Python
Django values()和value_list()的使用
Mar 31 Python
你喜欢篮球吗?Python实现篮球游戏
Jun 11 Python
python简单验证码识别的实现过程
Jun 20 Python
Python实现位图分割的效果
Nov 20 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
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
php模板中出现空行解决方法
2011/03/08 PHP
PHP mcrypt可逆加密算法分析
2011/07/19 PHP
PHP实现货币换算的方法
2014/11/29 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
2017/07/19 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
基于jQuery实现动态数字展示效果
2015/08/12 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
jquery,js简单实现类似Angular.js双向绑定
2017/01/13 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
python基础教程之元组操作使用详解
2014/03/25 Python
使用Python发送邮件附件以定时备份MySQL的教程
2015/04/25 Python
python实现一次创建多级目录的方法
2015/05/15 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
Python模拟三级菜单效果
2017/09/11 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
python scipy求解非线性方程的方法(fsolve/root)
2018/11/12 Python
Python 中 -m 的典型用法、原理解析与发展演变
2019/11/11 Python
python文字转语音的实例代码分析
2019/11/12 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
浅谈移动端网页图片预加载方案
2018/11/05 HTML / CSS
美国Lolё官网:购买大胆而美丽的女性运动服装
2017/05/22 全球购物
欧舒丹俄罗斯官方网站:L’OCCITANE俄罗斯
2019/11/22 全球购物
酒店管理自荐信
2013/10/23 职场文书
违反交通安全法检讨书
2014/10/24 职场文书
退休职工欢送会致辞
2015/08/01 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
ant design vue的form表单取值方法
2022/06/01 Vue.js