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 相关文章推荐
Django卸载之后重新安装的方法
Mar 15 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 Python
python 利用栈和队列模拟递归的过程
May 29 Python
pandas 将list切分后存入DataFrame中的实例
Jul 03 Python
Atom的python插件和常用插件说明
Jul 08 Python
python命令行工具Click快速掌握
Jul 04 Python
python实现12306登录并保存cookie的方法示例
Dec 17 Python
Selenium元素定位的30种方式(史上最全)
May 11 Python
在tensorflow以及keras安装目录查询操作(windows下)
Jun 19 Python
python Matplotlib基础--如何添加文本和标注
Jan 26 Python
python中的None与NULL用法说明
May 25 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 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获取网站域名和地址的代码
2008/08/17 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
PHP中如何实现常用邮箱的基本判断
2014/01/07 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
PHP使用PDO调用mssql存储过程的方法示例
2017/10/07 PHP
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
js正则匹配多个全部数据问题
2019/12/20 Javascript
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
JS实现密码框效果
2020/09/10 Javascript
python生成器的使用方法
2013/11/21 Python
详解Python中的join()函数的用法
2015/04/07 Python
学习python 之编写简单乘法运算题
2016/02/27 Python
Python 将RGB图像转换为Pytho灰度图像的实例
2017/11/14 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
利用CSS3实现平移动画效果示例代码
2016/10/12 HTML / CSS
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
餐饮业员工工作决心书
2014/03/11 职场文书
竞选班干部演讲稿
2014/04/24 职场文书
推荐信怎么写
2014/05/09 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
Python爬取某拍短视频
2021/06/11 Python
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang
js 实现Material UI点击涟漪效果示例
2022/09/23 Javascript