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网络编程之xmlrpc模块的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python远程调用rpc模块xmlrpclib的方法

    RPC(Remote Procedure Call Protocol)是远程调用协议,它通过网络请求服务到远端服务器,服务器根据请求做出响应,将结果返回 它是一种C/S模式,客户端可以调用远程服务器上的参数(类似URL)并返回结果 利用rpc可以实现系统的分布式架构,可以将功能分解到多台服务器上进行实现,同时也将也可以将负载打散,分布到不同服务器上,整合计算资源 在openstack中就大量使用了rpc rpc多使用http传输请求,格式有xml,json等,这里是xml 模块: xmlrpcl

  • python使用xmlrpclib模块实现对百度google的ping功能

    本文实例讲述了python使用xmlrpclib模块实现对百度google的ping功能.分享给大家供大家参考.具体分析如下: 最近在做SEO的时候,为了让发的外链能够快速的收录,想到了利用ping的功能,google和百度都有相关的ping介绍,有兴趣的朋友可以去看看相关的知识.实现ping功能除了可以用一些开源的博客程序,比如WP,它是可以在后台设置ping地址的,只要设置好以后,你发帖子,就会自动的通知搜索引擎,我的博客已经更新了,而今天我用的方法是不通过WP等带有ping功能的博客,自己

  • python使用xmlrpc实例讲解

    RPC是Remote Procedure Call的缩写,翻译成中文就是远程方法调用,是一种在本地的机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为"分布式计算",是为了提高各个分立机器的"互操作性"而发明出来的技术. XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用. 它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列的实现.这种远程过程调用使用http作为传

  • python基于xmlrpc实现二进制文件传输的方法

    本文实例讲述了python基于xmlrpc实现二进制文件传输的方法.分享给大家供大家参考.具体实现方法如下: 服务器端: from SimpleXMLRPCServer import SimpleXMLRPCServer import xmlrpclib def python_logo(): handle = open("python_logo.jpg",'rb') return xmlrpclib.Binary(handle.read()) handle.close() server

  • Python网络编程之xmlrpc模块

    简介 rpc:远程过程调用协议.简单的来说就是客户端可以很方便得远程调用服务端的接口程序,而不用管底层是如何实现的. XML-RPC的全称是XML Remote Procedure Call,即XML(标准通用标记语言下的一个子集)远程过程调用.它是一套允许运行在不同操作系统.不同环境的程序实现基于Internet过程调用的规范和一系列的实现.这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式.Xml-Rpc的定义尽可能的保持了简单,但同时能够传送.处理.返回复杂的数据结构.

  • Python网络编程之ftplib模块

    Python中默认安装的ftplib模块定义了FTP类,可用来实现简单的ftp客户端,用于上传或下载文件. ftp登陆连接 from ftplib import FTP # 加载ftp模块 ftp = FTP() # 设置变量 ftp.set_debuglevel(2) # 打开调试级别2,显示详细信息 ftp.connect("10.126.64.14", 21) # 连接的ftp sever和端口 ftp.login("usr_esop", "PWD4

  • Python网络编程之HTTP客户端模块urllib与urllib3

    一.urllib 概述: urllib是Python中请求url连接的官方标准库,就是你安装了python,这个库就已经可以直接使用了,基本上涵盖了基础的网络请求功能.在Python2中主要为urllib和urllib2,在Python3中整合成了urllib. Python3.x中将urllib2合并到了urllib,之后此包分成了以下四个模块: urllib.request: 它是最基本的http请求模块,用来模拟发送请求 urllib.error: 异常处理模块,如果出现错误可以捕获这些异

  • Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】

    本文实例讲述了Python 网络编程之UDP发送接收数据功能.分享给大家供大家参考,具体如下: demo.py(UDP发送数据): import socket # 导入socket模块 def main(): # 创建一个udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本机ip和端口号 (发送数据时,如果不绑定,系统会随机分配端口号.接收数据时,一般需要手动绑定ip和端口) udp_socket.b

  • Python网络编程之TCP套接字简单用法示例

    本文实例讲述了Python网络编程之TCP套接字简单用法.分享给大家供大家参考,具体如下: 上学期学的计算机网络,因为之前还未学习python,而java则一知半解,C写起来又麻烦,所以一直都没有真正实现过TCP套接字编程. 最近学习了python,而用它来写套接字又十分方便简单,所以当然要试一试咯. 下面根据代码来介绍一下最简单的tcp程序,由客户端输入数据,发送给服务器,服务器加上时间后返回给客户端 #!/usr/bin/python 'test TCP server' from socke

  • Python网络编程之socket与socketserver

    目录 一.基于TCP协议的socket套接字编程 1.套接字工作流程 1. 服务端套接字函数 2. 客户端套接字函数 3. 公共用途的套接字函数 4. 面向锁的套接字方法 5. 面向文件的套接字的函数 2.基于TCP协议的套接字编程 1. 服务端 2. 客户端 3.地址占用问题 1. 方法一:加入一条socket配置,重用ip和端口 2. 方法二:通过调整linux内核参数 4.模拟ssh远程执行命令 5.粘包 1.发送端需要等缓冲区满才发送出去,造成粘包 2.接收方不及时接收缓冲区的包,造成多

  • Python网络编程之HTTP协议的python应用

    目录 搭建python自带静态web服务器 1. 静态Web服务器是什么? 2. 如何搭建Python自带的静态Web服务器 3. 访问搭建的静态Web服务器 4. 查看浏览器和搭建的静态Web服务器的通信过程 静态web服务器-返回固定页面数据 1. 开发自己的静态Web服务器 2. 静态Web服务器-返回固定页面数据的示例代码 静态web服务器-返回指定页面数据 1. 静态Web服务器的问题 2. 静态Web服务器-返回指定页面数据的示例代码 静态web服务器-多任务实现 1. 静态Web服

  • Python网络编程之TCP与UDP协议套接字用法示例

    本文实例讲述了Python网络编程之TCP与UDP协议套接字用法.分享给大家供大家参考,具体如下: TCP协议 服务器端: #!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) ##创建服务器TCP套接字 tcpSerSoc

  • Python 网络编程之TCP客户端/服务端功能示例【基于socket套接字】

    本文实例讲述了Python 网络编程之TCP客户端/服务端功能.分享给大家供大家参考,具体如下: demo.py(TCP客户端): import socket def main(): # 1. 创建tcp的套接字 tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 链接服务器 # tcp_socket.connect(("192.168.33.11", 7890)) server_ip = input(

  • Python网络编程之ZeroMQ知识总结

    一.ZeroMQ概述 ZeroMQ(又名ØMQ,MQ,或zmq)像一个可嵌入的网络库,但其作用就像一个并发框架. ZeroMQ类似于标准Berkeley套接字,其提供了各种传输工具,如进程内.进程间.TCP和组播中进行原子消息传送的套接字 可以使用各种模式实现N对N的套接字连接,这些模式包括:发布-订阅.任务分配.请求-应答. ZeroMQ的速度足够快,因此可充当集群产品的结构. ZeroMQ的异步I/O模型提供了可扩展的多核应用程序,用异步消息来处理任务 ZeroMQ核心由C语言编写,支持C.

随机推荐