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

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">
4

2 に答える 2

6

予想される答えは、xml-rpcbase64タイプを使用したことだと思います。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

クライアントでバイナリデータをテキスト形式でエンコードし、サーバーでバイナリにデコードして戻すことができます。使用できるエンコーディングの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 に答える