使用XML-RPC Python进行分布式计算

问题描述

好的,这是一个我遇到问题的项目。我已经编写了代码,但是遇到了问题。坦白说,我什至不确定我是否正确连接了两个我必须正确使用的文件,因此,如果有人可以帮忙,并帮助我确定问题出在哪里,我会很高兴为您提供帮助。这是说明/提示

分布式计算应用程序中的常见任务通常需要 一台计算机能够远程调用过程的能力 分布式系统中的另一台计算机。此作业介绍 进一步使用XML-RPC和Python来实现这个想法。

XML-RPC是用于调用过程的协议(即方法或 一台计算机(客户端)在另一台计算机(服务器)上的功能)。它的 名称是由于XML用于编码过程调用而产生的。 用于将XML从客户端传输到服务器的方法是 HTTP。尽管Python内置了对此功能支持,但它确实是 需要注意的重要一点是,支持不仅限于Python,还扩展到 大多数高级语言添加。这是设计中固有的,因为 编码是通用XML,传输是HTTP。

最后,有很多方法可以实现这种功能。对于 Python,虽然不在本课程范围之内,但有兴趣的读者 应该探索Pyro,RPyC和Fabric等项目。

XML-RPC在Python中的实现可在xmlrpc软件包中找到。在 该软件包,所需的模块是xmlrpc.client和 xmlrpc.server。

分配

此作业需要您开发两个Python程序。一个是 客户端,另一个是服务器。

服务器 服务器应“注册” x客户端将要执行的过程 可以打电话。然后它将绑定到地址“ localhost”和端口 8000。这是服务器将侦听请求的地址和端口。请注意,如果您遇到绑定错误,则可以使用其他 端口,因为您的计算机可能具有正在使用8000的应用程序。 但是,这有时会起作用。您的服务器调用必须是 格式如下:

python server.py localhost 8000

这些受支持的过程如下:name-返回 服务器期间在命令行上传递的服务器名称 调用帮助–返回服务器要执行的过程的列表 支持servertime –返回服务器上的当前时间(24) 小时格式。即13:00:01 add(x,y)–返回x和y的总和 sub(x,y)–返回x – y mult(x,y)–返回x * y div(x,y)–返回 x / y(请务必处理被0除的情况)

客户 客户端将使用服务器的 服务器正在监听的地址和端口(请参见上文)。它 然后将使用值8执行每个受支持的过程 和6分别代表值x和y。您的客户调用必须 格式如下:

python client.py host_address host_port 8 6

其中host_address和host_port是地址和端口 服务器正在监听。如果您使用一台计算机作为服务器 而客户端计算机仅使用“ localhost”作为地址和端口 上面用过。 8和6是x和y的值。

客户端的示例输出

8 * 6是48.0 8/6是1.3333333333333333 8 + 6是14.0 8-6是2.0 8 / 0是Infinity 13:50:22

我将提供两个文件代码,以便有人可以提供帮助。发生问题的Server.py文件比Client.py文件更多,但是无论如何我都将发布它们。

Server.py

import sys
import time
from xmlrpc.server import SimpleXMLRPCServer

argumentList = sys.argv
hostAddress = argumentList[1]
port = argumentList[2]
server = SimpleXMLRPCServer((hostAddress,int(port)))


def addition(x,y):
    return x + y


def subtraction(x,y):
    return x - y


def multiplication(x,y):
    return x * y


def division(x,y):
    try:
        return x / y
    except ZeroDivisionError:
        return "To Infinity and Beyond! Whee!"


def name():
    return hostAddress


def helpMe():
    return server.systemListMethods()


def serverTime():
    return time.strftime("%H:%M:%s")


server.register_function(helpMe)
server.register_function(addition)
server.register_function(serverTime)
server.register_function(subtraction)
server.register_function(multiplication)
server.register_function(division)
server.serve_forever()

错误/警告屏幕截图

enter image description here

Client.py

import xmlrpc.client
import sys

argumentsList = sys.argv
hostAddress = argumentsList[1]
hostPort = argumentsList[2]

URI = "http://" + hostAddress + ":" + hostPort

num1 = int(argumentsList[3])
num2 = int(argumentsList[4])
proxy = xmlrpc.client.ServerProxy(URI)

print('{} + {} is {}'.format(num1,num2,proxy.add(num1,num2)))
print('{} - {} is {}'.format(num1,proxy.sub(num1,num2)))
print('{} * {} is {}'.format(num1,proxy.mul(num1,num2)))
print('{} / {} is {}'.format(num1,proxy.div(num1,num2)))
print(proxy.name())
print(proxy.help())
print(proxy.serverTime())

在此方面提供的任何帮助将不胜感激。

解决方法

server.py和client.py中都存在许多错误。我重写了文件,并纠正了错误。

server.py:

import sys
import time
from xmlrpc.server import SimpleXMLRPCServer

argumentList = sys.argv
hostAddress = '0.0.0.0'
port = '12345'
server = SimpleXMLRPCServer((hostAddress,int(port)))

def addition(x,y):
    return x + y

def subtraction(x,y):
    return x - y

def multiplication(x,y):
    return x * y

def division(x,y):
    try:
        return x / y
    except ZeroDivisionError:
        return "To Infinity and Beyond! Whee!"

def name():
    return hostAddress
 
def helpMe():
    return server.system_listMethods()

def serverTime():
    return time.strftime("%H:%M:%S")

server.register_function(name)
server.register_function(helpMe)
server.register_function(addition)
server.register_function(serverTime)
server.register_function(subtraction)
server.register_function(multiplication)
server.register_function(division)
server.serve_forever()

client.py

import xmlrpc.client
import sys

argumentsList = sys.argv
hostAddress = '127.0.0.1'
hostPort = '12345'

URI = "http://" + hostAddress + ":" + hostPort

num1 = int('7')
num2 = int('5')
proxy = xmlrpc.client.ServerProxy(URI)

print('{} + {} is {}'.format(num1,num2,proxy.addition(num1,num2)))
print('{} - {} is {}'.format(num1,proxy.subtraction(num1,num2)))
print('{} * {} is {}'.format(num1,proxy.multiplication(num1,num2)))
print('{} / {} is {}'.format(num1,proxy.division(num1,num2)))
print(proxy.name())
print(proxy.helpMe())
print(proxy.serverTime())

祝你好运