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提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
Linux上安装Python的PIL和Pillow库处理图片的实例教程
Jun 23 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
Python实现统计给定列表中指定数字出现次数的方法
Apr 11 Python
python读取有密码的zip压缩文件实例
Feb 08 Python
Django之编辑时根据条件跳转回原页面的方法
Aug 21 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
使用Python制作一个打字训练小工具
Oct 01 Python
Python txt文件常用读写操作代码实例
Aug 03 Python
vscode调试django项目的方法
Aug 06 Python
python help函数实例用法
Dec 06 Python
Python数据类型最全知识总结
May 31 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下获取客户端ip地址的函数
2010/03/15 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
jQuery Validation实例代码 让验证变得如此容易
2010/10/18 Javascript
JavaScript下通过的XMLHttpRequest发送请求的代码
2011/06/28 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
javascript如何操作HTML下拉列表标签
2015/08/20 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
jQuery事件用法详解
2016/10/06 Javascript
js实现导航吸顶效果
2017/02/24 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
Python六大开源框架对比
2015/10/19 Python
Python线程指南详细介绍
2017/01/05 Python
python3.4下django集成使用xadmin后台的方法
2017/08/15 Python
matplotlib 纵坐标轴显示数据值的实例
2018/05/25 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
python空元组在all中返回结果详解
2020/12/15 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
程序员机试试题汇总
2012/03/07 面试题
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
UNIX操作系统结构由哪几部分组成
2016/02/17 面试题
优秀教师的感人事迹
2014/02/04 职场文书
对孩子的寄语
2014/04/09 职场文书
青春寄语大全
2014/04/09 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书