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

客户端.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">
4

2 回答 2

6

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

import xmlrpclib
device = xmlrpclib.ServerProxy("http://localhost:1234/RPC2")
device.output(xmlrpclib.Binary(".\n."+chr(2)))
于 2014-02-12T19:25:39.133 回答
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()
于 2013-02-04T14:51:36.297 回答