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里使用正则表达式的分组命名方式
Oct 24 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
django 解决manage.py migrate无效的问题
May 27 Python
对python的输出和输出格式详解
Dec 08 Python
python使用wxpy轻松实现微信防撤回的方法
Feb 21 Python
详解Python做一个名片管理系统
Mar 14 Python
python 利用浏览器 Cookie 模拟登录的用户访问知乎的方法
Jul 11 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
pandas和spark dataframe互相转换实例详解
Feb 18 Python
Python3 webservice接口测试代码详解
Jun 23 Python
用Python提取PDF表格的方法
Apr 11 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
Apr 21 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读取XML格式文件的方法总结
2017/02/27 PHP
Laravel框架在本地虚拟机快速安装的方法详解
2018/06/11 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
jQuery的Ajax的自动完成功能控件简要说明
2013/02/22 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
JavaScript文本框脚本编写的注意事项
2016/01/25 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
JS获取checkbox的个数简单实例
2016/08/19 Javascript
ES6新特性六:promise对象实例详解
2017/04/21 Javascript
js字符串与Unicode编码互相转换
2017/05/17 Javascript
微信小程序canvas写字板效果及实例
2017/06/15 Javascript
浅谈layer的Icon样式以及一些常用的layer窗口使用方法
2019/09/11 Javascript
小程序自定义弹框效果
2020/11/16 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python中使用动态变量名的方法
2014/05/06 Python
python time模块用法实例详解
2014/09/11 Python
python 排序算法总结及实例详解
2016/09/28 Python
OpenCV实现人脸识别
2017/04/07 Python
详解Python中的type和object
2018/08/15 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
python返回数组的索引实例
2019/11/28 Python
Python递归实现打印多重列表代码
2020/02/27 Python
Python基于类路径字符串获取静态属性
2020/03/12 Python
termux中matplotlib无法显示中文问题的解决方法
2021/01/11 Python
美国机场停车位预订:About Airport Parking
2018/03/26 全球购物
Habitat家居英国官方网站:沙发、家具、照明、厨房和户外
2019/12/12 全球购物
DELPHI面试题研发笔试试卷
2015/11/08 面试题
精彩自我鉴定
2014/01/16 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
工程部岗位职责范本
2015/04/11 职场文书
Spring Cache和EhCache实现缓存管理方式
2021/06/15 Java/Android
Python并发编程实例教程之线程的玩法
2021/06/20 Python
Python Pandas pandas.read_sql函数实例用法
2021/06/21 Python