通过XML-RPC实现远程调用

问题:如何从机器B执行机器A上的程序?

方案1:机器A是一台windows机器,从机器B远程登录执行。

方案2:机器A是一台linux服务器,远程shell登录执行。

方案3:使用XML-RPC 构造一个远程调用服务。

前提条件:python3环境

解决方案:

首先,我们实现调用一个方法。

1、实现一个远程函数,支持调用, 假如机器的IP为:192.168.1.14

#encoding:utf-8
#导入xmlrpc服务
from xmlrpc.server import SimpleXMLRPCServer

#定义一个加法
def add(x,y):
  return x+y

#声明一个rpc server, 端口号为:15000
remote_service = SimpleXMLRPCServer(('192.168.1.14', 15000))

#注册add方法到服务中
remote_service.register_function(add)

#启动服务,开始监听
remote_service.serve_forever()

将代码保存到一个脚本中,命名为:simplerpc.py

在命令行中,执行:python simplerpc.py

2、声明一个调用脚本,调用远程机器A上的方法add。

from xmlrpc.client import ServerProxy

s = ServerProxy('http://192.168.1.14:15000', allow_none=True)
#调用方法,s.add(1, 2);获取1+2的值,为了从控制台看到结果,所以加额print
print(s.add(1, 2))

将代码保存在机器B中,命名为:simplerpc-client.py

在命令行中,执行:python simplerpc-client.py

从控制台中,我们可以看到结果:3

其次,实现调用一个脚本。

机器A上有一个脚本test.py,假如存在目录:/user/download/下

#encoding: utf-8
print("test")

机器A上的代码中,添加一个方法。

#encoding:utf-8
from xmlrpc.server import SimpleXMLRPCServer
import os

def add(x,y):
  return x+y
#通过os.popen方法,执行一个脚本
#执行后返回的是一个文件,通过read返回文件中的内容。
def runscript(scriptcmd):    
  result = os.popen(scriptcmd);
  return result.read();

serv = SimpleXMLRPCServer(('192.168.1.14', 15000))
serv.register_function(add)

#注册runscript方法
serv.register_function(runscript)
serv.serve_forever()

在机器B中调用机器A中的脚本:

from xmlrpc.client import ServerProxy
s = ServerProxy('http://192.168.1.14:15000', allow_none=True)
print(s.add(1, 2))
print(s.runscript('python3 /user/download/test.py')

执行后,在控制台将会看到:test 字符串

XML-RPC的一个缺点是它的性能。SimpleXMLRPCServer 的实现是单线程的, 所以它不适合于大型程序。

优点,这种方式的编码可以被绝大部分其他编程语言支持。 

通过使用这种方式,其他语言的客户端程序都能访问这个服务。

虽然XML-RPC有很多缺点,但是如果需要快速构建一个简单远程过程调用系统的话,它仍然值得去学习的。 

有时候,简单的方案就已经足够了。



留言