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 相关文章推荐
可用于监控 mysql Master Slave 状态的python代码
Feb 10 Python
python连接池实现示例程序
Nov 26 Python
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 Python
python脚本实现验证码识别
Jun 07 Python
python读写LMDB文件的方法
Jul 02 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
Dec 03 Python
Python应用领域和就业形势分析总结
May 14 Python
Django框架使用mysql视图操作示例
May 15 Python
详解python安装matplotlib库三种失败情况
Jul 28 Python
python实现自动化群控的步骤
Apr 11 Python
用python删除文件夹中的重复图片(图片去重)
May 12 Python
Python中的嵌套循环详情
Mar 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
一个简单的PHP入门源程序
2006/10/09 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
PHP框架性能测试报告
2016/05/08 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
复制本贴标题和地址的js代码
2008/07/01 Javascript
js URL参数的拼接方法比较
2012/02/15 Javascript
setTimeout的延时为0时多个浏览器的区别
2012/05/23 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
jquery实现Ctrl+Enter提交表单的方法
2015/07/21 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
JavaScript驾驭网页-获取网页元素
2016/03/24 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
Node.js Streams文件读写操作详解
2016/07/04 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
Python 冒泡,选择,插入排序使用实例
2015/02/05 Python
python使用BeautifulSoup分析网页信息的方法
2015/04/04 Python
python函数形参用法实例分析
2015/08/04 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
python数据封装json格式数据
2018/03/04 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
python调用webservice接口的实现
2019/07/12 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
美国最大的香水连锁店官网:Perfumania
2016/08/15 全球购物
C语言笔试集
2012/07/24 面试题
杠杆的科学教学反思
2014/01/10 职场文书
庆八一活动方案
2014/01/25 职场文书
期末学生评语大全
2014/04/24 职场文书
2015世界地球日活动总结
2015/02/09 职场文书
《三国志》赏析
2019/08/27 职场文书
导游词之任弼时故居
2020/01/07 职场文书