파이썬은 RPC를 구현합니다 - xmlrpc 라이브러리의 간단한 사용

1. RPC 소개

RPC(원격 프로시저 호출) 원격 프로시저 호출은 네트워크를 통한 원격 컴퓨터 프로그램의 서비스 요청입니다. RPC는 서로 다른 서비스 간의 호출 문제를 해결하기 위한 설계이며 완전한 RPC 구현에는 일반적으로 두 가지 전송 프로토콜과 직렬화 프로토콜이 포함됩니다.

RPC는 클라이언트/서버 모델을 채택합니다. 요청 프로그램은 클라이언트이고 서비스 제공 프로그램은 서버입니다. 먼저 클라이언트 호출 프로세스는 서버에 요청 메시지를 보낸 다음 응답 메시지를 기다립니다. 서버 측에서 프로세스는 요청된 정보가 도착할 때까지 휴면 상태를 유지합니다. 요청 메시지가 도착하면 서버는 프로세스 매개변수를 획득한 후 해당 서비스 메서드를 실행하고 그 결과를 클라이언트에 반환한 후 서버 프로세스가 닫힐 때까지 계속해서 다음 요청 메시지를 기다립니다.

Python3에서 xmlrpc 라이브러리는 RPC를 구현하는 데 사용되며 xmlrpc.server와 xmlrpc.client로 나뉩니다.

2. xmlrpc 라이브러리 사용 예

1. rpc 서버 구현

rpc_server.py

from xmlrpc.server import SimpleXMLRPCServer


# 1.定义能被客户端调用的类
class MethodSet(object):
    @staticmethod
    def say_hello():
        print("MethodSet的方法正在被调用...")
        str1 = "hello rpc!"
        return str1


# 2.定义能被客户端调用的函数
def say_hi():
    print("say_hi 函数正在被调用...")
    str2 = "hi rpc~"
    return str2


# 3.注册一个函数或者类来响应XML-RPC请求,并启动XML-RPC服务器
def setup_socket_service(server_ip="localhost", server_port=6666):
    try:
        server = SimpleXMLRPCServer((server_ip, server_port))  # 初始化XML-RPC服务
        print('Server {} Listening on port {} ...'.format(server_ip, server_port))
        server.register_instance(MethodSet())  # 注册一个类
        server.register_function(say_hi)  # 注册一个函数
        server.serve_forever()  # 启动服务器并永久运行
    except Exception as ex:
        raise Exception('Setup socket server error:\n{}'.format(ex))


if __name__ == '__main__':
    setup_socket_service()

서버를 시작합니다(프로그램은 항상 실행 중이어야 하며 닫지 마십시오): python rpc_server.py
결과를 시작한 후:

min@LAPTOP-E6G8RE06 MINGW64 /e/study/mat
$ python rpc_server.py
Server localhost Listening on port 6666 ...

2. 클라이언트 구현

rpc_client.py

from xmlrpc.client import ServerProxy


def setup_socket_client(ip_address, port=6666):
    proxy = ServerProxy('http://%s:%s/' % (ip_address, port), allow_none=True)
    print('Connect to {}:{} successful ...'.format(ip_address, port))

    ret1 = proxy.say_hello()   # 调用
    print('Received the ret1 is {}'.format(ret1))

    ret2 = proxy.say_hi()  # 调用
    print('Received the ret2 is {}'.format(ret2))


if __name__ == '__main__':
    setup_socket_client(ip_address='localhost')

클라이언트를 시작하고 요청을 시작합니다. python rpc_client.py
통화 결과(클라이언트):

min@LAPTOP-E6G8RE06 MINGW64 /e/study/mat
$ python rpc_client.py
Connect to localhost:6666 successful ...
Received the ret1 is hello rpc!
Received the ret2 is hi rpc~

호출 결과(서버):

min@LAPTOP-E6G8RE06 MINGW64 /e/study/mat
$ python rpc_server.py
Server localhost Listening on port 6666 ...
MethodSet的方法正在被调用...
127.0.0.1 - - [19/Jun/2021 19:58:11] "POST / HTTP/1.1" 200 -
say_hi 函数正在被调用...
127.0.0.1 - - [19/Jun/2021 19:58:13] "POST / HTTP/1.1" 200 -

추천

출처blog.csdn.net/weixin_45455015/article/details/118058401