我如何在XML-RPC(Python)中传输二进制数据?

5
作为“xmlrpc”的名称暗示的那样,这种传输协议依赖于“XML”来传递数据,不能传输二进制数据或不可打印的ASCII字符(\n、\b、chr(2)等)[或者可以吗?]。
我想知道是否有一种安全地从客户端向服务器传输字符字符串的方法,并对编码影响最小(即仅在客户端方面)。我尝试了“xmlrpclib.Binary”类,但这似乎只适用于文件。
测试代码,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">

你得到了什么结果? - Ned Batchelder
@Ned:请查看更新后的问题。我之所以出现错误是因为chr(2)字符。 - Alex
2个回答

6

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

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

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()

这需要在服务器端和客户端都进行编码。 - Alex
这不是代码所显示的吗?;) 不过,我明白你的意思了,会更正表达方式。或者你的意思是你没有控制服务器? - isedev
我正在寻找一种只改变客户端的解决方案。我希望您可以使用“二进制”对象,并使服务器端自动解码,而无需在服务器端进行代码更改。 - Alex
如果您也控制服务器,则最简单的方法是编码/解码二进制数据(个人看法)。也许Base64有点过度,您可以使用某种转义编码(例如URL编码方案或类似方法)。 - isedev
我有一个事实:使用Python的base64进行大数据转换可能会严重消耗您的系统内存和资源。我尝试在100MB的文件上进行转换,结果开始出现了卡顿(对我的系统而言是崩溃)。但是,如果文件大小为10MB,则不会出现问题。 - AmaanK
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接