热门标签 | 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()






推荐阅读
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • JavaScript 基础语法指南
    本文详细介绍了 JavaScript 的基础语法,包括变量、数据类型、运算符、语句和函数等内容,旨在为初学者提供全面的入门指导。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 本文介绍了如何利用Python进行批量图片尺寸调整,包括放大和等比例缩放。文中提供了详细的代码示例,并解释了每个步骤的具体实现方法。 ... [详细]
  • Nginx 反向代理与负载均衡实验
    本实验旨在通过配置 Nginx 实现反向代理和负载均衡,确保从北京本地代理服务器访问上海的 Web 服务器时,能够依次显示红、黄、绿三种颜色页面以验证负载均衡效果。 ... [详细]
  • 反向投影技术主要用于在大型输入图像中定位特定的小型模板图像。通过直方图对比,它能够识别出最匹配的区域或点,从而确定模板图像在输入图像中的位置。 ... [详细]
  • Windows 7 64位系统下Redis的安装与PHP Redis扩展配置
    本文详细介绍了在Windows 7 64位操作系统中安装Redis以及配置PHP Redis扩展的方法,包括下载、安装和基本使用步骤。适合对Redis和PHP集成感兴趣的开发人员参考。 ... [详细]
  • C#设计模式学习笔记:观察者模式解析
    本文将探讨观察者模式的基本概念、应用场景及其在C#中的实现方法。通过借鉴《Head First Design Patterns》和维基百科等资源,详细介绍该模式的工作原理,并提供具体代码示例。 ... [详细]
  • 社交网络中的级联行为 ... [详细]
  • 本文介绍如何使用 Angular 6 的 HttpClient 模块来获取 HTTP 响应头,包括代码示例和常见问题的解决方案。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
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社区 版权所有