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中字符串前面加r的作用
Jun 04 Python
Python实现的科学计算器功能示例
Aug 04 Python
python如何实现内容写在图片上
Mar 23 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
Python List列表对象内置方法实例详解
Oct 22 Python
Numpy与Pytorch 矩阵操作方式
Dec 27 Python
python如何写出表白程序
Jun 01 Python
Python Django搭建网站流程图解
Jun 13 Python
浅谈keras中的keras.utils.to_categorical用法
Jul 02 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 Python
Python的property属性详细讲解
Apr 11 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
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
php 网页游戏开发入门教程一(webgame+design)
2009/10/26 PHP
PHP代码保护--Zend Guard的使用详解
2013/06/03 PHP
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
javascript 建设银行登陆键盘
2008/06/10 Javascript
jQuery Ajax 实例全解析
2011/04/20 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
jQuery中extend函数详解
2015/02/13 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
使用Jquery实现每日签到功能
2015/04/03 Javascript
JavaScript 事件绑定及深入
2015/04/13 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
详解Vue用cmd创建项目
2019/02/12 Javascript
python文件读写并使用mysql批量插入示例分享(python操作mysql)
2014/02/17 Python
Python实现子类调用父类的方法
2014/11/10 Python
Python使用plotly绘制数据图表的方法
2017/07/18 Python
python实现用户答题功能
2018/01/17 Python
python实现K最近邻算法
2018/01/29 Python
pandas计数 value_counts()的使用
2019/06/24 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
如何写你的创业计划书
2014/01/07 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
说明书格式及范文
2014/05/07 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
详解Flutter和Dart取消Future的三种方法
2022/04/07 Java/Android