【问题标题】:How can I transfer binary data over xmlrpc (python)?如何通过 xmlrpc (python) 传输二进制数据?
【发布时间】:2013-01-19 07:03:57
【问题描述】:

正如名称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:查看更新后的问题。由于chr(2) 字符,我收到错误消息。

标签: python python-2.7 xml-rpc xmlrpclib


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以尝试在客户端将二进制数据编码为文本格式,然后在服务器中将其解码回二进制。您可以使用的一种编码是 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()
    

    【讨论】:

    • 这需要同时在服务器端和客户端进行编码。
    • 代码不就是这样吗? ;) 但是,明白了你的意思,将更正表达式。或者你的意思是你不控制服务器?
    • 我正在寻找一种解决方案来改变客户端。我希望,您可以使用 Binary 对象并让服务器端自动解码它,而无需在服务器端更改代码。
    • 这将证明,因为 XML 是基于文本的格式。您是否尝试过将二进制数据包装在 CDATA 块中?
    • 如何更改代码以包装在 CDATA 中?事实上,我控制着服务器,但我希望将工作量减少到最低限度。
    猜你喜欢
    • 2017-01-22
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多