python标准库xmlrpc 之RPC远程方法调用

news2024/11/26 5:11:48

💖💖💖养成每日阅读好习惯, 每天进步, 超越昨天的自己💖💖💖
愿景:输出体系化编程知识与技巧,助力软件行业发展与从业者学习减负,让编程产生更大价值。

🔎🔎🔎
Python 专栏文章: 👉👉👉Python 文章专栏大全 | 有勇气的牛排👈👈👈

大家好,我是有勇气的牛排🐮🐮🐮
有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!

一、前言🐮

Remote Procedure Call即RPC(远程方法调用),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。并且被多重语言支持,故能在多种语言的服务器中相互调用。

RPC采用客户机/服务器模式。请求程序即为客户机,服务程序为服务端。首先由客户端发起一个远程调用并等待,然后由服务端进行处理、计算并应答,结束后进入睡眠状态,客户端继续进行运行。

二、 ServerProxy 对象🐮

ServerProxy 实例有一个方法与 XML-RPC 服务器所接受的每个远程过程调用相对应。 调用该方法会执行一个 RPC,通过名称和参数签名来调度(例如同一个方法名可通过多个参数签名来重载)。 RPC 结束时返回一个值,它可以是适用类型的返回数据或是表示错误的 Fault 或 ProtocolError 对象。

1、简单的搭建

(1)server

from xmlrpc.server import SimpleXMLRPCServer

rpc_server = "127.0.0.1"
rpc_port = 8000

def get_name(name):
    res = f"名字:{name}"
    return res


server = SimpleXMLRPCServer((rpc_server, rpc_port))
print("Listening on port 8000...")

server.register_function(get_name, "get_name")

# 保持等待调用状态
server.serve_forever()

(2)client

import xmlrpc.client

rpc_server = "127.0.0.1"
rpc_port = 8000

proxy = xmlrpc.client.ServerProxy(f"http://{rpc_server}:{rpc_port}/")

print(str(proxy.get_name("有勇气的牛排")))
# 输出:名字:有勇气的牛排

2、 支持多线程

(1)server

多线程
自定义类ThreadXMLRPCServer,继承两个基类,ThreadingMixIn, SimpleXMLRPCServer
ThreadingMixIn:帮助支持多线程
SimpleXMLRPCServer:RPC支持

from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn

rpc_server = "127.0.0.1"
rpc_port = 8000


class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
    """
        多线程
        自定义类ThreadXMLRPCServer,继承两个基类,ThreadingMixIn, SimpleXMLRPCServer
        ThreadingMixIn:帮助支持多线程
        SimpleXMLRPCServer:RPC支持
    """
    pass


def get_name(name):
    res = f"名字:{name}"
    return res


if __name__ == '__main__':
    # 多线程 class ThreadXMLRPCServer
    server = ThreadXMLRPCServer((rpc_server, rpc_port))

    print("Listening on port 8000...")

    # 注册函数
    server.register_function(get_name, "get_name")

    # 保持等待调用状态
    server.serve_forever()

(2)client

# _*_ coding:utf-8 _*_

from xmlrpc.client import ServerProxy

rpc_server = "127.0.0.1"
rpc_port = 8000

if __name__ == '__main__':
    # 初始化服务器
    proxy = ServerProxy(f"http://{rpc_server}:{rpc_port}/")

    # 调用函数 get_name
    res = str(proxy.get_name("有勇气的牛排"))
    print(res)

三、DateTime 对象🐮

该类的初始化可以使用距离 Unix 纪元的秒数、时间元组、ISO 8601 时间/日期字符串或 datetime.datetime 实例。

server

from datetime import datetime
from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn
import xmlrpc.client

rpc_server = "127.0.0.1"
rpc_port = 8000


class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
    pass


# DateTime 对象
def get_server_time():
    today = datetime.today()
    return xmlrpc.client.DateTime(today)

if __name__ == '__main__':
    # 多线程 class ThreadXMLRPCServer
    server = ThreadXMLRPCServer((rpc_server, rpc_port), allow_none=True)
    print("Listening on port 8000...")

    server.register_function(get_server_time, "get_server_time")

    # 保持等待调用状态
    server.serve_forever()

client

from datetime import datetime
from xmlrpc.client import ServerProxy

rpc_server = "127.0.0.1"
rpc_port = 8000

if __name__ == '__main__':
    server = ServerProxy(f"http://{rpc_server}:{rpc_port}/")

    server_time = datetime.strptime(server.get_server_time().value, "%Y%m%dT%H:%M:%S")
    print(server_time)

image.png

四、Binary 对象🐮

RPC除了互相串参数外,文件也是可以传的,即上传与下载。我们这里可以使用Binary对象即可实现。

该类的初始化可以使用字节数据(可包括 NUL)。

server

from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn
import xmlrpc.client

rpc_server = "127.0.0.1"
rpc_port = 8000


class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
    pass


# 提供客户端下载文件
def get_file():
    handle = open("test.txt", 'rb')
    return xmlrpc.client.Binary(handle.read())


# 提供客户端上传文件
def put_file(data):
    handle = open(f"./tmp/test.txt", "wb")
    handle.write(data.data)
    handle.close()


if __name__ == '__main__':
    # 多线程 class ThreadXMLRPCServer
    server = ThreadXMLRPCServer((rpc_server, rpc_port), allow_none=True)
    # server = SimpleXMLRPCServer((rpc_server, rpc_port))
    print("Listening on port 8000...")

    # 注册函数
    server.register_function(get_file, "get_file")
    server.register_function(put_file, "put_file")

    # 保持等待调用状态
    server.serve_forever()

client

from xmlrpc.client import ServerProxy
import xmlrpc.client

rpc_server = "127.0.0.1"
rpc_port = 8000

if __name__ == '__main__':
    server = ServerProxy(f"http://{rpc_server}:{rpc_port}/")

    # 上传文件
    put_handle = open("test.txt", 'rb')
    server.put_file(xmlrpc.client.Binary(put_handle.read()))
    put_handle.close()

    # 下载文件
    # get_handle = open("./tmp/test.txt", 'wb')
    # get_handle.write(server.get_file().data)
    # get_handle.close()

五、报错🐮

<Fault 1: "<class 'TypeError'>:cannot marshal None unless allow_none is enabled"

添加allow_none=True即可

server = ThreadXMLRPCServer((rpc_server, rpc_port), allow_none=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167783.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】之网络安全

防火墙作用 在计算机领域,防火墙是用于保护信息安全的设备,其会依照用户定义的规则,允许或限制数据的传输。 用于保护内网安全的一种设备依据规则进行防护用户定义规则允许或拒绝外部用户访问防火墙分类 逻辑上划分,防火墙可以大体分为主机防火墙和网络防火墙 主机防火墙:…

服务注册与发现:Nacos Discovery

目录 一、概述 二、Nacos discovery——服务的注册与发现 1. 版本关系 2. 下载安装 &#xff08;1&#xff09;下载 &#xff08;2&#xff09;启动 &#xff08;3&#xff09;浏览器访问 三、Nacos服务注册与发现实战 1. 构建Spring Cloud Alibaba工程 &#xff08;1&…

Vite性能优化之分包策略

为什么需要分包策略&#xff1f; 浏览器的缓存策略 浏览器在请求静态资源时&#xff0c;只要静态资源的名称不变&#xff0c;它就不会重新请求 xxx.js资源。 使用Vite打包后的js文件是带有哈希值的&#xff0c;只要我们的代码内容有一点点变化&#xff0c;那么文件的hash值都…

ConfigMap

目录 文章目录目录本节实战前言1、创建:warning: yaml里易混淆的点&#xff08;1&#xff09;|用法&#xff08;2&#xff09;|和|-用法&#xff08;3&#xff09;>用法1.通过资源清单文件方法创建ConfigMap2.通过from-file关键字创建ConfigMap&#xff08;1&#xff09;fro…

二十九、Kubernetes中CronJob(CJ)详解

1、概述 在kubernetes中&#xff0c;有很多类型的pod控制器&#xff0c;每种都有自己的适合的场景&#xff0c;常见的有下面这些&#xff1a; ReplicationController&#xff1a;比较原始的pod控制器&#xff0c;已经被废弃&#xff0c;由ReplicaSet替代 ReplicaSet&#xff…

yolov5训练自己的数据集,OpenCV DNN推理

学更好的别人&#xff0c; 做更好的自己。 ——《微卡智享》 本文长度为4238字&#xff0c;预计阅读9分钟 前言 上一篇《OpenCV--自学笔记》搭建好了yolov5的环境&#xff0c;作为目标检测在应用中&#xff0c;最重要的还是训练自己的数字集并推理&#xff0c;所以这一篇就专门…

『Kubernetes』在Linux中快速安装K8S集群

&#x1f4e3;读完这篇文章里你能收获到 K8S安装全过程博主自己实操笔记带你跳过所有坑感谢点赞收藏&#xff0c;避免下次找不到~ 文章目录一、基本环境配置1. 关闭selinux2. 关闭swap分区或禁用swap文件3. 修改网卡配置4. 关闭防火墙5. 设置机器HostName6. 更新系统时间二、k…

Vue 2.x源码学习:数据响应式改造

众所周知&#xff0c;Vue是以数据驱动视图展示的&#xff0c;即Vue会监听数据的变化&#xff0c;从而自动重新渲染页面的结构。 Vue主要通过三步走来实现这个功能&#xff1a; 第一步是对数据进行响应式改造&#xff0c;即对数据的读写操作进行劫持&#xff1b; 第二步是对模…

字符数组编程题(C语言)

文章目录1、用字符%c的形式给一个字符数组赋初值&#xff0c;然后以字符串%s的形式输出2、用字符getchar&#xff08;&#xff09;的形式给一个字符数组赋初值&#xff0c;然后以字符串puts&#xff09;的形式输出4、从键盘上输入一串字符gets&#xff0c;然后输出%s5、从键盘输…

Mysql导出100万条数据,9种导出方法优缺点和速度、文件大小测试

这里写目录标题1.DBase文件2.文本文件3. CSV文件4.HTML文件5.Excel数据表低版本6.Excel文件2007年以后版本7.SQL脚本文件8.XML文件9.JSON文件总结这一次我主要就是想针对mysql导出的速度和文件大小进行优缺点测试&#xff0c;这次主要就是用上之前生成的天气表这是表里面的数据…

除夕New Year Eve,祝大家团圆幸福!

除夕&#xff0c;为岁末的最后一天夜晚,意为旧岁至此而除&#xff0c;另换新岁。New years Eve is the last night at the end of the year.which means that the old year will be removed and a new year will be replaced.除夕&#xff0c;在国人心中是具有特殊意义的&#…

第一章 TCP/IP 协议

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.什么是TCP/IP ​编辑 二.什么是协议 1.三要素 2.协议与标准区别 三.广…

中小型企业如何从企业内容管理 (ECM) 系统提供的工具中受益?

在当今快节奏的商业世界中&#xff0c;时间变得非常宝贵。团队越大&#xff0c;就越难有效地管理时间。但即使是中小型企业也可以从企业内容管理 (ECM) 系统提供的工具中受益。 ECM 系统使各种规模的企业能够通过数字化纸质文档、捕获电子文档和电子邮件、自动化文档驱动的流…

(转)Chrome的最小字体12px限制最终解决办法

相信不少做网站的用户会有这样一个问题&#xff0c;Chrome 默认最小字体是12px&#xff08;最新版英文也有此问题&#xff09;&#xff0c;这个是 Chrome 为了更好显示中文设计的&#xff0c;但是这样一来就会出现某些上标、下标字体过大&#xff0c;影响用户体验。之前在开发H…

ue4c++日记2(继承|设置位置|对象移动)

目录 语句速查 静态网格定义 创建静态网格对象 设置对象位置 编辑器可编辑 编辑器可见 仅类默认值处可见 速览定义可查剩下 对象移动 1继承 例子 1.创建actor 2.命名和填写路径 小插曲 3.新建一个蓝图类继承上面创建的actor 4.其可蓝图化是因为创建的c类可蓝图化 5…

【算法基础】1.8离散化

文章目录离散化如何离散确定映射方式区间和当数据范围的跨度很大&#xff0c;但是数据很稀疏时&#xff0c;可以使用离散化。 离散化 如何离散 数据范围很大&#xff0c;但是并不是每个数字都会出现&#xff0c;就可以将原始数据按照顺序映射到一个小的数据范围。 确定映射方…

第五届字节跳动青训营 前端进阶学习笔记(二)JavaScript编码规范

文章目录1.前言2.写好JS的一些基本原则这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天 1.前言 本次课程主要讲解了有关JavaScript编码原则和代码优化的相关问题。 重点内容&#xff1a; HTML、CSS、JS各司其责具备正确性、扩展性、复用性的组件封装函数式编程思想代…

进程、线程及python的多线程编程

目录 一.进程、线程和并行执行 1.什么是进程、线程 注意 2.什么是并行执行 二.python的多线程编程 threading模块 语法 多线程编程的传参 演示 三.总结 一.进程、线程和并行执行 1.什么是进程、线程 现代操作系统比如Mac OS X,UNIX, Linux, Windows等&#xff0c;都是…

CSC|2023年艺术类人才培养特别项目解读及建议

目前国家留学基金委&#xff08;CSC&#xff09;官网已经发布了2023年艺术类人才培养特别项目通知&#xff0c;知识人网小编现将其选派工作流程、选派办法、申请材料及说明&#xff08;访问学者、博士后&#xff09;原文转载并加以解读、提出建议。知识人网解读及建议一、2023年…

新产品Digi XBee RR无线模块迁移指南

&#xff08;咨询申请 - 上海皕科电子有限公司--专注物联网 登记后&#xff0c;可提供相关资料&#xff0c;购买XBee模块&#xff0c;有机会获得USB评估底板及相关中文资料&#xff0c;或者免费申请借用评估套件&#xff09; 目录 一、简介 1、MicroPython 2、蓝牙 3、文件…