2010-05-14 3 views
3

Я экспериментирую с XML-RPC.Что может вызвать xmlrpclib.ResponseError: ResponseError()?

У меня есть следующий сценарий сервера (Python):

from SimpleXMLRPCServer import SimpleXMLRPCServer 

server = SimpleXMLRPCServer(('localhost', 9000)) 

def return_input(someinput): 
return someinput 

server.register_function(return_input) 

try: 
    print 'ctrl-c to stop server' 
    server.serve_forever() 
except KeyboardInterrupt: 
    print 'stopping' 

и следующий клиентский скрипт:

import xmlrpclib 

server = xmlrpclib.ServerProxy('http://www.example.com/pathto/xmlrpcTester2.py') 
print server.return_input('some input') 

Я испытал это на месте, и она отлично работает. Все, что он делает, выплевывает входные данные из клиентского скрипта, что является правильным.

Однако, когда я пытаюсь сделать это на удаленном сервере, я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "client.py", line 4, in <module> 
    print server.return_input('some input') 
    File  "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line  1199, in __call__ 
    return self.__send(self.__name, args) 
    File  "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line  1489, in __request 
    verbose=self.__verbose 
    File  "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line  1253, in request 
return self._parse_response(h.getfile(), sock) 
File  "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line  1392, in _parse_response 
return u.close() 
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line 836, in close 
raise ResponseError() 
xmlrpclib.ResponseError: ResponseError() 

Любые идеи, что может привести к этому?

UPDATE:

когда verbose=True:

send: 'POST /pythonScripts/xmlrpcTester2.py HTTP/1.0\r\nHost:   www.example.com\r\nUser-Agent: xmlrpclib.py/1.0.1 (by www.pythonware.com)\r\nContent- Type: text/xml\r\nContent-Length: 166\r\n\r\n' 
send: "<?xml version='1.0'? >\n<methodCall>\n<methodName>return_input</methodName>\n<params>\n<param>\n<value><string>so me input</string></value>\n</param>\n</params>\n</methodCall>\n" 
reply: 'HTTP/1.1 200 OK\r\n' 
header: Date: Fri, 14 May 2010 20:52:25 GMT 
header: Server: Apache/2.2.9 (Fedora) 
header: Last-Modified: Fri, 14 May 2010 20:52:03 GMT 
header: ETag: "7e206-13d-486940c17a2c0" 
header: Accept-Ranges: bytes 
header: Content-Length: 317 
header: Connection: close 
header: Content-Type: text/plain; charset=UTF-8 
body: "from SimpleXMLRPCServer import SimpleXMLRPCServer\r\n\r\nserver = SimpleXMLRPCServer(('localhost', 8000))\r\n\r\ndef return_input(someinput):\r\n\treturn  someinput\r\n\r\nserver.register_function(return_input)\r\n\r\ntry:\r\n  print 'ctrl-c to  stop server'\r\n  server.serve_forever()\r\nexcept KeyboardInterrupt:\r\n  print  'stopping'" 
Traceback (most recent call last): 
    File "client.py", line 4, in <module> 
    print server.return_input('some input') 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line 1199, in __call__ 
    return self.__send(self.__name, args) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line 1489, in __request 
    verbose=self.__verbose 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line 1253, in request 
    return self._parse_response(h.getfile(), sock) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line 1392, in _parse_response 
    return u.close() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/xmlrpclib.py", line 836, in close 
    raise ResponseError() 
xmlrpclib.ResponseError: ResponseError() 

ответ

2

Похоже, что-то еще работает на этом порту на удаленном компьютере. И отправил неожиданный ответ.

Я бы сказал, что сервер работает правильно. Затем проверьте, есть ли что-либо в настройках брандмауэра, которые могут повлиять на вещи.

Вы также можете включить подробный флаг в клиенте, чтобы узнать, не проливает ли свет на проблему.

EDIT:

Таким образом, подробный вывод проясняет проблему: вы не используете сервер, вы делите его через обычный веб-сервер!

Вам необходимо запустить сервер на удаленной машине.

+0

Спасибо Douglas; Я изучаю ваши предложения. Если это помогает, я обновил сообщение с тем, что получаю, когда verbose = True – Tom

Смежные вопросы