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基于socket实现网络广播的方法
Apr 29 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
Sep 18 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
Jun 11 Python
python 数字类型和字符串类型的相互转换实例
Jul 17 Python
TensorFlow用expand_dim()来增加维度的方法
Jul 26 Python
python 将列表中的字符串连接成一个长路径的方法
Oct 23 Python
python使用udp实现聊天器功能
Dec 10 Python
对python中大文件的导入与导出方法详解
Dec 28 Python
python爬虫基础教程:requests库(二)代码实例
Apr 09 Python
django中上传图片分页三级联动效果的实现代码
Aug 30 Python
Python Unittest原理及基本使用方法
Nov 06 Python
python 三种方法实现对Excel表格的读写
Nov 19 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
一个MYSQL操作类
2006/11/16 PHP
PHP读取xml方法介绍
2013/01/12 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
vue实现全选、反选功能
2020/11/17 Javascript
详解vue项目首页加载速度优化
2017/10/18 Javascript
vue项目中使用Hbuilder打包app 设置沉浸式状态栏的方法
2018/10/22 Javascript
vscode 配置vue+vetur+eslint+prettier自动格式化功能
2020/03/23 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
[01:14:34]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第一局
2016/02/28 DOTA
python获得linux下所有挂载点(mount points)的方法
2015/04/29 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
利用Python绘制有趣的万圣节南瓜怪效果
2019/10/31 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
python 实现简易的记事本
2020/11/30 Python
全球速卖通西班牙站:AliExpress西班牙
2017/10/30 全球购物
Ibatis的核心配置文件都有什么
2014/09/08 面试题
super关键字的用法
2012/04/10 面试题
介绍一下JMS编程步骤
2015/09/22 面试题
党委书记岗位职责
2013/11/24 职场文书
总经理岗位职责描述
2014/02/08 职场文书
聘任书的写作格式及范文
2014/03/29 职场文书
交通安全寄语大全
2014/04/08 职场文书
专业技术人员年度考核评语
2014/12/31 职场文书
预备党员半年考察意见
2015/06/01 职场文书
英雄儿女观后感
2015/06/09 职场文书
2016年6月份红领巾广播稿
2015/12/21 职场文书
2019辞职报告范本3篇!
2019/07/23 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技