zoukankan      html  css  js  c++  java
  • python rpc 简单实现自带包xmlrpc

    RPC简介

    RPC是Remote Procedure Call的缩写,翻译成中文为:远程方法调用。

    它是一种在本地机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了提高各个分立机器的“互操作性”而发明出来的技术。

      XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。

    它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。XML- RPC(http://www.xmlrpc.com)是由美国UserLand公司指定的一个RPC协议。简单的理解是:将数据定义为xml格式,通过http协议进行远程传输。

    优点:

      1. 传输复杂的数据。
      1. 通过程序语言的封装,实现远程对象的调用。

    Python下的XML-RPC

    1. 类库:SimpleXMLRPCServer

      一般使用在服务器端,这个模块用来构造一个最基本的XML-RPC服务器框架。

    1. 类库:xmlrpclib

      一般使用在客户端,这个模块用来调用注册在XML-RPC服务器端的函数,xmlrpclib并不是一个类型安全的模块,无法抵御恶意构造的数据,这方面的一些处理工作需要交给开发者自己。

    大致用法:使用SimpleXMLRPCServer模块运行XMLRPC服务器,在其中注册服务器提供的函数或者对象;然后在客户端内使用xmlrpclib.ServerProxy连接到服务器,想要调用服务器的函数,直接调用ServerProxy即可

    简单实现server(单线程或多线程),client,具体流程见代码部分,编码后启动server,再运行client。

    1.server

    # -*- coding: utf-8 -*-
    # @Time    : 2021-05-13 17:11
    # @Author  : davis
    # @FileName: server.py
    # @Software: PyCharm
    
    from xmlrpc.server import SimpleXMLRPCServer
    import sys
    from SocketServer import ThreadingMixIn
    
    class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):
        pass
    
    # 定义函数
    def add(x, y):
        print('func:{}, x:{}, y:{}'.format(sys._getframe().f_code.co_name,x,y))
        return x + y
    
    def divide(x, y):
        print('func:{}, x:{}, y:{}'.format(sys._getframe().f_code.co_name, x, y))
        return x - y
    
    # 定义类
    class HelloRpc:
        def hello(self):
            print('hello, xmlrpc.')
            return 'xmlrpc'
    
    # 1.创建server
    server = SimpleXMLRPCServer(('127.0.0.1', 9090))
    # 上面默认单线程,也可以创建多线程,但接受几个客户端请求时,挨个处理,客户端不改
    server = ThreadXMLRPCServer(("localhost", 9090), allow_none=True)
    
    print('listening on port 9090...')
    # 2.注册多重调用函数
    server.register_multicall_functions()
    server.register_function(add, 'add')
    server.register_function(divide, 'divide')
    
    # 注册类对象
    ins = HelloRpc()
    server.register_instance(ins)
    
    # 3.保持监听
    server.serve_forever()
    
    ----------结果------------
    listening on port 9090...
    127.0.0.1 - - [13/May/2021 17:26:43] "POST /RPC2 HTTP/1.1" 200 -
    func:add, x:53, y:85
    func:divide, x:89, y:51
    hello, xmlrpc.
    

    2.client

    # -*- coding: utf-8 -*-
    # @Time    : 2021-05-13 17:11
    # @Author  : davis
    # @FileName: client.py
    # @Software: PyCharm
    
    from xmlrpc.client import ServerProxy, MultiCall
    
    # 1.创建代理,ip,port保持和远程的调用对象保持一致
    proxy = ServerProxy(('http://127.0.0.1:9090'))
    
    # 2.连接代理
    multicall = MultiCall(proxy)
    
    # 3.调用远程对象函数
    multicall.add(53,85)
    multicall.divide(89,51)
    
    # 调用远程对象的方法
    multicall.hello()
    
    # 4.获取此次调用结果,tuple封装
    result = multicall()
    
    print('calculation results: {0}, {1}, {2}'.format(result[0], result[1], result[2]))
    
    ----------结果------------
    calculation results: 138, 38, xmlrpc
    
  • 相关阅读:
    (OK) 编译cBPM-android—CentOS 7—NDK8—androideabi-4.7— API14
    (OK) 编译xerces-c-3.1.2(动态库)—CentOS 7— android-ndk
    (OK) 编译libiconv-1.14(静态库)—CentOS 7— android-ndk
    (OK) 编译xerces-c-3.1.2(静态库)—CentOS 7— android-ndk
    (OK) 在Android系统上运行C/C++程序
    (OK—C++程序) CodeBlocks — CentOS 7 + android-ndk
    (OK) CentOS7 安装 Codeblocks
    (OK—C++程序) Eclipse C/C++ — CentOS 7 + android-ndk + eclipse-cpp-mars-R
    (OK) CentOS 7 + android-ndk-r10d-linux-x86_64 + Android (ARM)—ndk-build
    (OK—C程序) Eclipse C/C++ — CentOS 7 + android-ndk + eclipse-cpp-mars-R
  • 原文地址:https://www.cnblogs.com/davis12/p/14765509.html
Copyright © 2011-2022 走看看