Python中实现远程调用(RPC、RMI)简单例子

 更新时间:2014年04月28日 09:21:06   作者:  
说白了,远程调用就是将对象名、函数名、参数等传递给远程服务器,服务器将处理结果返回给客户端

远程调用使得调用远程服务器的对象、方法的方式就和调用本地对象、方法的方式差不多,因为我们通过网络编程把这些都隐藏起来了。远程调用是分布式系统的基础。

远程调用一般分为两种,远程过程调用(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读写csv文件并增加行列的实例代码

    python读写csv文件并增加行列的实例代码

    这篇文章主要介绍了python读写csv文件并增加行列的实现方法,文中给大家介绍了python写入csv文件的几种方法总结,给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • 如何使用pyinstaller打包多个和单个python文件详解

    如何使用pyinstaller打包多个和单个python文件详解

    最近需要将python写的程序打包分发给其他同事使用,下面这篇文章主要给大家介绍了关于如何使用pyinstaller打包多个和单个python文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 谈谈Python中的while循环语句

    谈谈Python中的while循环语句

    这篇文章主要给大家介绍了关于Python中while循环语句的相关资料,使用while循环语句可以解决程序中需要重复执行的操作,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2019-03-03
  • 如何使用python计算复杂三角函数

    如何使用python计算复杂三角函数

    当涉及到计算复杂的三角函数时,Python 提供了强大的数学库和函数来帮助我们进行计算,在本篇博客中,我将介绍如何使用 Python 来计算复杂的三角函数,需要的朋友可以参考下
    2023-08-08
  • Python获取抖音关注列表封号账号的实现代码

    Python获取抖音关注列表封号账号的实现代码

    最近抖音关注到达上限5000个了,所以就导致很多漂亮小姐姐没办法关注了,那么这里就通过python获取已经被封号的帐号取消关注就可以了
    2021-06-06
  • python基于隐马尔可夫模型实现中文拼音输入

    python基于隐马尔可夫模型实现中文拼音输入

    这篇文章主要介绍了python基于隐马尔可夫模型实现中文拼音输入的相关资料,需要的朋友可以参考下
    2016-04-04
  • Python中单元测试的快速入门指南

    Python中单元测试的快速入门指南

    在这篇文章中,我们会深入探讨Python单元测试的各个方面,包括它的基本概念、基础知识、实践方法、高级话题,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-07-07
  • PyTorch中torch.save()的用法和应用小结

    PyTorch中torch.save()的用法和应用小结

    本文主要介绍了PyTorch中torch.save()的用法和应用小结,torch.save()的主要作用就是将PyTorch对象保存到磁盘上,下面就来具体介绍一下,感兴趣的可以了解一下
    2024-03-03
  • Python使用matplotlib时显示中文乱码解决方法(或更改字体)

    Python使用matplotlib时显示中文乱码解决方法(或更改字体)

    这篇文章主要给大家介绍了关于Python使用matplotlib时显示中文乱码的解决方法(或更改字体),在Matplotlib中,中文乱码问题通常出现在图表的标题、标签和刻度上,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Python可视化Tkinter进阶grid布局详情

    Python可视化Tkinter进阶grid布局详情

    这篇文章主要介绍了Python可视化Tkinter进阶grid布局详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07

最新评论