热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:pythonxmlrpc模块

篇首语:本文由编程笔记#小编为大家整理,主要介绍了pythonxmlrpc模块相关的知识,希望对你有一定的参考价值。简介rpc:远程过程调用协

篇首语:本文由编程笔记#小编为大家整理,主要介绍了python xmlrpc模块相关的知识,希望对你有一定的参考价值。



简介

rpc:远程过程调用协议。简单的来说就是客户端可以很方便得远程调用服务端的接口程序,而不用管底层是如何实现的。

XML-RPC的全称是XML Remote Procedure Call,即XML(标准通用标记语言下的一个子集)远程过程调用。它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。这个过程也被大家称为“分布式计算”。
xmlrpc:使用http协议作为传输协议的rpc机制。
技术图片

1、注册函数:register_function

以下是定义了一个函数的xmlrpc服务端。

register_function用于注册一个供调用的函数,第一个参数为自己实现的方法名,第二个参数为供客户端调用的方法名。

from xmlrpc.server import SimpleXMLRPCServer #导入模块
s = SimpleXMLRPCServer(("10.55.22.11",4242)) #服务端ip假设为10.55.22.11,端口假设为4242
def twice(x): #定义函数
return x*2
s.register_function(twice)
#注册函数(让客户端发现)
s.serve_forever() #启动服务端

下面是该服务端对应的xmlrpc客户端

根据url和端口号初始化一个服务器对象,然后调用需要的方法即可:

import xmlrpc.client #导入模块
s = xmlrpc.client.ServerProxy(http://10.55.22.11:4242) #链接服务端
print(s.twice(2)) #调用函数

调用成功成功后服务端会显示
技术图片

2、注册类方法函数:register_instance

 服务端如:

from xmlrpc.server import SimpleXMLRPCServer # 导入模块
s = SimpleXMLRPCServer(("10.81.10.57",4242)) # 设置服务端ip和端口
class Animal: #定义类
def rabit(self, amount):
return 4*amount
def chicken(self, amount):
return 2*amount
s.register_instance(Animal())
# 注册类方法函数(让客户端发现)
s.serve_forever() # 启动服务端

对应的客户端如下:

import xmlrpc.client # 导入模块
s = xmlrpc.client.ServerProxy(http://10.81.10.57:4242) # 链接服务端
print(s.rabit(2)) # 调用函数
print(s.chicken(2))

3、dispatch方法

接下来要修改一些注册类方法函数接口的参数,对应的修改一下类定义。通过在类定义中添加—_dispatch方法可以在远程调用接口的时候经过_dispach。
服务端如下:

from xmlrpc.server import SimpleXMLRPCServer # 导入模块
s = SimpleXMLRPCServer(("10.81.10.57",4242)) # 设置服务端ip和端口
class Animal: # 定义类
def _dispatch(self, method, param): # 定义_dispatch方法
print(method) # 在服务端显示调用的方法名
func = getattr(self, method) # 调用接口
return func(*param)
def rabit(self, amount):
return 4*amount
def chicken(self, amount):
return 2*amount
s.register_instance(Animal())
# 注册函数(让客户端发现)
s.serve_forever() # 启动服务端

客户端如下:

import xmlrpc.client # 导入模块
s = xmlrpc.client.ServerProxy(http://10.81.10.57:4242) # 链接服务端
print(s.rabit(2)) # 调用函数
print(s.chicken(2))

注: 服务器端运行结果:

技术图片

4、多线程访问

初始化服务器用的不再是SimpleXMLRPCServer了,而是自定义的一个类,继承自两个基类,ThreadingMixIn使其能够支持多线程,其余的操作方式还是和普通的一样。

并且我们新增了一个函数,接受两个参数,计算和,可以看到无论参数数量多少,我们注册函数的时候都只写函数名

from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn
class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
pass
# 调用函数1
def respon_string(str):
return "get string:%s"%str
# 调用函数2
def add(x, y):
return x + y
if __name__ == __main__:
server
= ThreadXMLRPCServer((localhost, 8888)) # 初始化
server.register_function(respon_string, "get_string") # 注册函数1
server.register_function(add, add) # 注册函数2
print ("Listening for Client")
server.serve_forever()
# 保持等待调用状态

客户端代码如下:

from xmlrpc.client import ServerProxy
if __name__ == __main__:
server
= ServerProxy("http://localhost:8888") # 初始化服务器
print (server.get_string("cloudox")) # 调用函数1并传参
print (server.add(8, 8)) # 调用函数2并传参

5、文件上传&下载

RPC除了传参以外还可以在客户端与服务器之间传输文件——客户端既可以从服务器下载文件,也可以上传文件到服务器。

传输文件要用到xmlrpc.client.Binary这个库,如果要实现从服务器下载文件的功能,那么服务器端也需要导入这个库,即使它名义上属于client库。

传输文件的基本步骤是:

  • 用open打开一个文件(没有的话会创建),确定是读权限还是写权限;
  • 在文件发送端通过调用xmlrpc.client.Binary来进行文件的传输,接收端通过值.data来获取内容(详见代码);
  • 关闭文件。

服务器:

初始化服务器时多了个参数allow_nOne=True,这是允许不返回参数给客户端,因为文件上传的函数都是没有返回值的,不设置这个参数会报错,实际上这里也应该返回一个值告诉客户端是否上传成功。

文件上传的代码中可以看到,写入的是data.data,单单data是会报错的,因为实际上要写入的是Binary.data,这在下面的客户端代码下载文件时也会看到。

from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn
import xmlrpc.client
class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
pass
# 供客户端下载文件
def image_get():
handle
= open("boy.jpg", rb)
return xmlrpc.client.Binary(handle.read())
# 供客户端上传文件
def image_put(data):
handle
= open("get_girl.jpg", wb)
handle.write(data.data)
handle.close()
if __name__ == __main__:
server
= ThreadXMLRPCServer((localhost, 8888), allow_nOne=True) # 初始化
server.register_function(image_put, image_put)
server.register_function(image_get,
image_get)
print ("Listening for Client")
server.serve_forever()
# 保持等待调用状态

客户端

可以看到,下载文件时写入的也是获取到的返回值.data,而不是返回值本身,这个一定要注意。

from xmlrpc.client import ServerProxy
import xmlrpc.client
if __name__ == __main__:
server
= ServerProxy("http://localhost:8888", allow_nOne=True)
# 上传文件
put_handle = open("girl.jpg", rb)
server.image_put(xmlrpc.client.Binary(put_handle.read()))
put_handle.close()
# 下载文件
get_handle = open("get_boy.jpg", wb)
get_handle.write(server.image_get().data)
get_handle.close()






推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
author-avatar
冰忆ch
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有