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

Ale*_*lex 4 python xml-rpc xmlrpclib python-2.7

正如其名称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()
Run Code Online (Sandbox Code Playgroud)

client.py:

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

预期结果:

46-10-46-2
Run Code Online (Sandbox Code Playgroud)

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

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

小智 6

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

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


ise*_*dev 1

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

在你的客户端中:

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

在您的服务器中:

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()
Run Code Online (Sandbox Code Playgroud)