python中的xmlrpc客户端调用没有回来

时间:2010-03-30 13:44:51

标签: python client xml-rpc

使用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 个答案:

答案 0 :(得分:5)

正如您所注意到的,这是服务器中的一个错误(客户端声称理解1.0并且服务器忽略了它并且无论如何都以1.1响应,所以不关闭套接字)。 Python为2.7和3.2中的这类错误服务器提供了一种解决方法,请参阅this issue,但该解决方法不在2.6.4中。不幸的是,从2.6.5的NEWS.txt看来我们还没有将它向后移植到2.6.5。 2.7中的变通方法补丁是here,如果只是无法修复有缺陷的服务器,也许你可以自己尝试将它应用到2.6.5 ......?

答案 1 :(得分:2)

最有可能的是,一旦将响应发送回客户端,您正在测试的服务器就不会关闭TCP连接。因此,客户端挂起,等待服务器关闭连接,然后才能从函数返回。