首页 > 编程语言 >Python中实现远程调用(RPC、RMI)简单例子

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

时间:2023-08-03 17:02:13浏览次数:40  
标签:__ name Python Pyro4 uri greeting RPC RMI maker


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

远程调用一般分为两种,远程过程调用(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.。

标签:__,name,Python,Pyro4,uri,greeting,RPC,RMI,maker
From: https://blog.51cto.com/u_6186189/6950913

相关文章

  • python以及java环境搭建+解决不同版本环境共存问题
    1.搭建python环境1.安装python3.9.7,选择自定义安装、将文件添加至环境路径,然后选择下一步。2.默认、然后选择下一步。3.选择适用于所有使用者,选择自己想要存放的路径,然后选择点击安装。等待片刻。。。4.点击安装完成。使用cdm命令,输入python查看是否安装成功。5.安装python2......
  • minio python sdk使用
    如下fromminioimportMiniofromminio.errorimportS3Errorimportlogginglogging.basicConfig(filename='logs/myProgramLog.log',level=logging.INFO,format='%(asctime)s-%(levelname)s-%(message)s')classBucket......
  • [算法题python]728.自除数
    自除数 是指可以被它包含的每一位数整除的数。例如,128 是一个 自除数 ,因为 128%1==0,128%2==0,128%8==0。自除数 不允许包含0。给定两个整数 left 和 right ,返回一个列表,列表的元素是范围 [left,right] 内所有的 自除数 。 示例1:输入:left=......
  • Python | 判断语句、循环语句
    上一篇:Python|基础语法判断是程序最基础最核心的逻辑功能。1.布尔类型和比较运算符1.1布尔(bool)类型布尔(bool)表达现实生活中的逻辑,即真和假:True表示真;False表示假。True本质上是一个数字记作1,False记作01.1.1布尔类型字面量True表示真(是、肯定)False表示假(否......
  • python第三天
    python开发ide:pycharm,eclipse一、运算符1、算数运算符+-*/幂**余%求整数9//2=4判断字符是否在字符串里面in   notinname="阿拉斯加"if"文件"inname:print("ok")else:print("notok")  2、比较运算符==<><=>=!=不等于<......
  • [数据分析与可视化] Python绘制数据地图4-MovingPandas入门指北
    MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库,用于处理移动物体的轨迹数据。它提供了一组强大的工具,可以轻松地加载、分析和可视化移动物体的轨迹。通过使用MovingPandas,用户可以轻松地处理和分析移动对象数据,并从中提取有关行为、模式和趋势的见解。无论是处......
  • Python 将playwright 脚本打包exe
    1、需要将playwright版本下载,注意:如果不想执行exe出现cmd弹窗,则需要将playwright版本安装为1.29.0。参考:https://blog.csdn.net/tdl320721/article/details/1287372732、下载playwright对应的浏览器驱动,playwrightinstallchrome3、查看python环境目录内的  \Lib\site-......
  • Python开发实例(二)To-Do列表应用:创建一个简单的命令行应用,允许用户添加、删除和查看待
    defprint_todo_list(todo_list):ifnottodo_list:print("待办事项列表为空!")else:print("待办事项列表:")forindex,todoinenumerate(todo_list,1):print(f"{index}.{todo}")defadd_todo(todo_......
  • 【python_4】基础语法:字面量和注释!
    1.字面量的含义字面量:在代码中,被写下来的固定的值,称之为字面量。2.常见的字面量类型类型描述说明数字Number支持:整数int浮点数float复数complex布尔bool整数int,如10,-10浮点数float,如13.14,-13.14复数complex,如4+3j布尔bool,表达现实生活中的逻辑,即真和假,True表示真,False表示假。True......
  • python使用mqtt
    一、安装mqtt服务器安装对应的软件:https://www.emqx.io/zh/downloads推荐使用docker安装默认账号和密码:admin、public 二、编写代码消息发布程序importtimeimportjsonimportpsutilimportrandomfrompaho.mqttimportclientasmqtt_clientbroker='127.0.0.1......