Python中的xmlrpc客户端调用没有返回

2 投票
2 回答
2448 浏览
提问于 2025-04-15 21:02

使用的是Python 2.6.4,操作系统是Windows。

我写了一个脚本,想要测试一个特定的xmlrpc服务器。我调用了一个不存在的函数,希望能看到一个错误的追踪信息。但是,结果是这个函数没有返回任何东西。可能是什么原因呢?

import xmlrpclib
s = xmlrpclib.Server("http://127.0.0.1:80", verbose=True)
s.functioncall()

输出结果是:

send: 'POST /RPC2 HTTP/1.0\r\nHost: 127.0.0.1:80\r\nUser-Agent: xmlrpclib.py/1.0
.1 (by www.pythonware.com)\r\nContent-Type: text/xml\r\nContent-Length: 106\r\n\
r\n'
send: "<?xml version='1.0'?>\n<methodCall>\n<methodName>functioncall</methodName
>\n<params>\n</params>\n</methodCall>\n"
reply: 'HTTP/1.1 200 OK\r\n'
header: Content-Type: text/xml
header: Cache-Control: no-cache
header: Content-Length: 376
header: Date: Tue, 30 Mar 2010 13:27:21 GMT
body: '<?xml version="1.0"?>\r\n<methodResponse>\r\n<fault>\r\n<value>\r\n<struc
t>\r\n<member>\r\n<name>faultCode</name>\r\n<value><i4>1</i4></value>\r\n</membe
r>\r\n<member>\r\n<name>faultString</name>\r\n<value><string>PVSS00ctrl   (2), 2
010.03.30 15:27:21.395, CTRL, SEVERE,     72, Function not defined, functioncall
, , \n</string></value>\r\n</member>\r\n</struct>\r\n</value>\r\n</fault>\r\n</m
ethodResponse>\r\n'

(在这里程序卡住了,直到我强制关闭服务器才会返回)

补充说明:这个服务器是用C++写的,使用了它自己的xmlrpc库。

补充说明:我发现了一个问题,看起来和我遇到的情况很相似 http://bugs.python.org/issue1727418

2 个回答

2

很可能,你正在测试的服务器在发送完回复给你的客户端后,并没有关闭TCP连接。因此,客户端就会一直卡在那里,等着服务器关闭连接,才能从这个函数中返回。

5

正如你所注意到的,这个问题是服务器的一个bug(客户端声称它支持1.0版本,但服务器却不理会,还是用1.1版本回应,所以没有关闭连接)。在Python的2.7和3.2版本中,有一个解决这种有问题的服务器的办法,具体可以查看这个问题,但在2.6.4版本中没有这个解决办法。很遗憾,从2.6.5的更新日志来看,似乎我们也没有把这个办法移植到2.6.5版本中。2.7版本的解决办法的补丁在这里,也许你可以尝试把它应用到2.6.5版本上,如果实在无法修复那个有问题的服务器的话……

撰写回答