如何通过xmlrpc传输二进制数据(python)?
正如名字 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">
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()