如何通过xmlrpc(python)传输二进制数据?

时间:2013-02-04 14:45:18

标签: python python-2.7 xml-rpc xmlrpclib

正如名称xmlrpc所暗示的,此传输协议依赖于XML来传输数据,并且无法传输二进制数据或不可打印的ASCII字符(\ n,\ b,chr(2) ),...)[或者可以吗?]。

我想知道是否有一种方法可以将字符串安全地从客户端传输到服务器,而对编码的影响最小(即仅在客户端)。我尝试了xmlrpclib.Binary类,但这似乎只适用于文件。

Testcode,server.py:

def output(text):
    print "-".join([str(ord(x)) for x in text])

from SimpleXMLRPCServer import SimpleXMLRPCServer
server = SimpleXMLRPCServer(('localhost', 1234))
server.register_function(output)
server.serve_forever()

client.py:

import xmlrpclib
device = xmlrpclib.ServerProxy("http://localhost:1234/RPC2")
device.output(".\n."+chr(2))

预期结果:

46-10-46-2

看到结果(在服务器端):

xmlrpclib.Fault: <Fault 1: "<class 'xml.parsers.expat.ExpatError'>:not well-formed (invalid token): line 7, column 1">

2 个答案:

答案 0 :(得分:6)

我认为预期的答案是使用xml-rpc base64类型。在python中,在客户端,您必须使用xmlrpclib.Binary类型手动指定字符串包含二进制数据。

import xmlrpclib
device = xmlrpclib.ServerProxy("http://localhost:1234/RPC2")
device.output(xmlrpclib.Binary(".\n."+chr(2)))

答案 1 :(得分:1)

您可以尝试在客户端中以文本格式对二进制数据进行编码,然后将其解码回服务器中的二进制文件。您可以使用的一种编码是base64。

在您的客户中:

import xmlrpclib
import base64
device = xmlrpclib.ServerProxy("http://localhost:1234/RPC2")
device.output(base64.b64encode(".\n."+chr(2)))

在您的服务器中:

import base64
def output(text):
    print "-".join([str(ord(x)) for x in base64.b64decode(text)])

from SimpleXMLRPCServer import SimpleXMLRPCServer
server = SimpleXMLRPCServer(('localhost', 1234))
server.register_function(output)
server.serve_forever()