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 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
深入分析在Python模块顶层运行的代码引起的一个Bug
Jul 04 Python
浅谈Python生成器generator之next和send的运行流程(详解)
May 08 Python
Python探索之URL Dispatcher实例详解
Oct 28 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
对Django 转发和重定向的实例详解
Aug 06 Python
在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程
Apr 22 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
快速解决pymongo操作mongodb的时区问题
Dec 05 Python
python 实现ping测试延迟的两种方法
Dec 10 Python
python批量提取图片信息并保存的实现
Feb 05 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
php从字符串创建函数的方法
2015/03/16 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
一个封装js代码-----展开收起效果示例
2013/07/03 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
js保留两位小数方法总结
2018/01/31 Javascript
nodejs(officegen)+vue(axios)在客户端导出word文档的方法
2018/07/31 NodeJs
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
Python中列表和元组的使用方法和区别详解
2020/12/30 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
用python打印1~20的整数实例讲解
2019/07/01 Python
python实现日志按天分割
2019/07/22 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
pycharm激活码快速激活及使用步骤
2020/03/12 Python
如何使用python切换hosts文件
2020/04/29 Python
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
Hunkemöller西班牙:欧洲最大的内衣连锁店
2018/08/15 全球购物
运动会入场词50字
2014/02/20 职场文书
消防宣传口号
2014/06/16 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
人生遥控器观后感
2015/06/11 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
python接口测试返回数据为字典取值方式
2022/02/12 Python