Skip to main content
 首页 » 编程设计

python之使用 twisted 处理文件

2025年05月04日8think

我正在尝试设置一个扭曲的 xmlrpc 服务器,它将接受来自客户端的文件,处理它们,并返回一个文件和结果字典。

我以前使用过 python,但从未使用过扭曲的库。出于我的目的,安全性不是问题,而且 ssh 协议(protocol)似乎有点矫枉过正。它在 Windows 服务器上也有问题,因为 termios不可用。

因此,我的所有研究都表明 xmlrpc 是实现这一目标的最佳方式。但是,有两种文件传输方法可用。使用 xml binary data方法,或 http request方法。

无论哪种方式,文件都可能达到几百兆,那么我应该使用哪种方法呢?感谢示例代码,因为我找不到关于使用 twisted 通过 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吗?

请您参考如下方法:

XML-RPC 是文件传输的糟糕选择。 XML-RPC 要求文件内容以 XML 支持的方式进行编码。这在运行时成本和网络资源方面都是昂贵的。相反,尝试使用普通的旧 HTTP 发布或放置文件。