2

クライアントからファイルを受け取り、それらを処理し、ファイルと結果ディクショナリを返すツイストxmlrpcサーバーをセットアップしようとしています。

私は以前にPythonを使用しましたが、ツイストライブラリは使用していません。私の目的では、セキュリティは問題ではなく、sshプロトコルはやり過ぎのようです。利用できないため、Windowsサーバーでも問題が発生しtermiosます。

したがって、私の研究はすべて、xmlrpcがこれを達成するための最良の方法であることを示しています。ただし、ファイル転送には2つの方法があります。xml binary dataメソッド、またはメソッドを使用しhttp requestます。

ファイルはどちらの方法でも最大数百メガバイトになる可能性があるので、どちらの方法を使用する必要がありますか?ツイストされたxmlを介したファイル転送のドキュメントが見つからなかったため、サンプルコードをいただければ幸いです。

アップデート:

したがって、でファイルをシリアル化するとxmlrpclib.Binary、大きなファイルでは機能しないようです。または、間違って使用しています。以下のテストコード:

from twisted.web import xmlrpc, server

class Example(xmlrpc.XMLRPC):
    """
    An example object to be published.
    """

    def xmlrpc_echo(self, x):
        """
        Return all passed args.
        """
        return x

    def xmlrpc_add(self, a, b):
        """
        Return sum of arguments.
        """
        return a + b

    def xmlrpc_fault(self):
        """
        Raise a Fault indicating that the procedure should not be used.
        """
        raise xmlrpc.Fault(123, "The fault procedure is faulty.")

    def xmlrpc_write(self, f, location):
        with open(location, 'wb') as fd:
            fd.write(f.data)

if __name__ == '__main__':
    from twisted.internet import reactor
    r = Example(allowNone=True)
    reactor.listenTCP(7080, server.Site(r))
    reactor.run()

そしてクライアントコード:

import xmlrpclib
s = xmlrpclib.Server('http://localhost:7080/')
with open('test.pdf', 'rb') as fd:
    f = xmlrpclib.Binary(fd.read())
s.write(f, 'output.pdf')

これをxmlrpclib.Fault: <Fault 8002: "Can't deserialize input: ">テストするとわかります。ファイルがPDFだからですか?

4

1 に答える 1

1

XML-RPCは、ファイル転送には適していません。XML-RPCでは、XMLがサポートする方法でファイルコンテンツをエンコードする必要があります。これは、実行時のコストとネットワークリソースの両方で高価です。代わりに、プレーンな古いHTTPを使用してファイルをPOSTまたはPUTするだけにしてみてください。

于 2012-07-18T17:30:28.330 に答える