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 相关文章推荐
kNN算法python实现和简单数字识别的方法
Nov 18 Python
Python自动化构建工具scons使用入门笔记
Mar 10 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
Dec 18 Python
Python实现的FTP通信客户端与服务器端功能示例
Mar 28 Python
python日期时间转为字符串或者格式化输出的实例
May 29 Python
Python之时间和日期使用小结
Feb 14 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
Feb 17 Python
对pyqt5之menu和action的使用详解
Jun 20 Python
PyCharm第一次安装及使用教程
Jan 08 Python
Python统计学一数据的概括性度量详解
Mar 03 Python
有趣的Python图片制作之如何用QQ好友头像拼接出里昂
Apr 22 Python
如何通过安装HomeBrew来安装Python3
Dec 23 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
介绍几个array库的新函数 php
2006/12/29 PHP
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
php 各种应用乱码问题的解决方法
2010/05/09 PHP
第四章 php数学运算
2011/12/30 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
PHP获取当前日期和时间及格式化方法参数
2015/05/11 PHP
wamp服务器访问php非常缓慢的解决过程
2015/07/01 PHP
ThinkPHP框架搭建及常见问题(XAMPP安装失败、Apache/MySQL启动失败)
2016/04/15 PHP
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
一文看懂如何简单实现节流函数和防抖函数
2019/09/05 Javascript
Vue.set 全局操作简单示例
2019/09/19 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
js实现QQ邮箱邮件拖拽删除功能
2020/08/27 Javascript
vue实现前端列表多条件筛选
2020/10/26 Javascript
Python实现的选择排序算法示例
2017/11/29 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
python实现抖音点赞功能
2019/04/07 Python
django和vue实现数据交互的方法
2019/08/21 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
Python如何急速下载第三方库详解
2020/11/02 Python
python爬虫beautifulsoup库使用操作教程全解(python爬虫基础入门)
2021/02/19 Python
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
幼师求职自荐信范文
2014/01/26 职场文书
消防安全检查制度
2014/02/04 职场文书
表彰会主持词
2014/03/26 职场文书
小学优秀班主任事迹材料
2014/05/17 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
王兆力在市委党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
教师节班会开场白
2015/06/01 职场文书
Ajax异步刷新功能及简单案例
2021/11/20 Javascript