2013-02-04 84 views
4

正如其名称所暗示xmlrpc,该传送协议依赖于XML携带数据,而不能传输二进制数据,或不可打印的ASCII字符(\ N,\ B,CHR(2),...)或可以它?]。如何通过xmlrpc(python)传输二进制数据?

我想知道是否有从客户端上的编码影响最小(即仅在客户端)能够安全地传递一个字符串到服务器的方式。我尝试了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() 

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"> 
+0

,做你会得到什么结果? –

+0

@Ned:查看更新后的问题。由于'chr(2)'字符,我得到错误。 – Alex

回答

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

这需要在服务器和客户端都进行编码。 – Alex

+0

这不是代码显示的内容吗? ;)但是,明白了你的观点,将会改正表达。或者你的意思是你不控制服务器? – isedev

+0

我正在寻找解决方案来更改客户端。我希望,你可以使用'Binary'对象并让服务器端自动解码它,而不需要在服务器端进行代码更改。 – Alex

6

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

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