繁体   English   中英

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

[英]Distributed Computing With XML-RPC Python

好的,这是我遇到问题的一个项目。 我已经写好了代码,但它遇到了问题。 坦率地说,我什至不确定我是否连接了我必须正确使用的两个文件,所以如果有人能看一下并帮助我确定问题所在,我会很高兴得到帮助。 这是说明/提示。

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

XML-RPC 是一种协议,用于调用另一台计算机(服务器)上的一台计算机(客户端)的过程(即方法或函数)。 它的名称源于 XML 用于对过程调用进行编码的事实。 用于将 XML 从客户端传输到服务器的方法是 HTTP。 虽然 Python 已内置对此功能的支持,但重要的是要注意,该支持不仅限于 Python,还扩展到大多数高级语言add。 这是设计中固有的,因为编码是通用 XML,传输是 HTTP。

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

XML-RPC 在 Python 中的实现可以在 xmlrpc 包中找到。 在这个包中,需要的模块是 xmlrpc.client 和 xmlrpc.server。

任务

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

服务器服务器应该“注册”客户端能够调用的x个过程。 然后它将绑定到地址“localhost”和端口 8000。这是服务器将侦听请求的地址和端口。 请注意,如果您有绑定错误,您可以使用另一个端口,因为您的计算机可能有一个使用 8000 的应用程序。但是,大多数情况下,这会起作用。 您的服务器调用必须采用以下形式:

python server.py 本地主机 8000

支持的这些过程如下: name – 返回服务器调用时在命令行上传递的服务器名称 help – 返回服务器支持的过程列表 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 是无穷大 13:50:22

我将提供这两个文件的代码,以便有人能够提供帮助。 与 Client.py 文件相比,Server.py 文件有更多问题,但无论如何我都会发布这两个文件。

服务器.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()

错误/警告截图在此处输入图片说明

客户端.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, num2, proxy.sub(num1, num2)))
print('{} * {} is {}'.format(num1, num2, proxy.mul(num1, num2)))
print('{} / {} is {}'.format(num1, num2, proxy.div(num1, num2)))
print(proxy.name())
print(proxy.help())
print(proxy.serverTime())

对此的任何帮助将不胜感激。

您的 server.py 和 client.py 中都有很多错误。 我重新编写了错误更正的文件。

服务器.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()

客户端.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, num2, proxy.subtraction(num1, num2)))
print('{} * {} is {}'.format(num1, num2, proxy.multiplication(num1, num2)))
print('{} / {} is {}'.format(num1, num2, proxy.division(num1, num2)))
print(proxy.name())
print(proxy.helpMe())
print(proxy.serverTime())

祝你好运

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM