Соединение с витым клиентом потеряно

У меня очень простая клиентская программа:

class EchoClient(Int32StringReceiver):

    def connectionMade(self):
        print 'connection made.'
        str = "<request><commands><dbtest /></commands></request>"
        self.sendString(str)
        print 'message sent'

    def stringReceived(self, line):
        print "receive:", line
        self.transport.loseConnection()

class EchoClientFactory(ClientFactory):

    def buildProtocol(self, addr):
        return EchoClient()

    def clientConnectionFailed(self, connector, reason):
        print 'connection failed:', reason.getErrorMessage()
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print 'connection lost:', reason.getErrorMessage()
        reactor.stop()

def main():
    factory = EchoClientFactory()
    reactor.connectTCP('localhost', 3604, factory)
    reactor.run()

Я подключаюсь к сервису Java, реализованному в Apache CXF (и некотором проприетарном коде компании).

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

К сожалению, этот клиент не ждет, пока сервер создаст свое сообщение, а отключается сразу после отправки сообщения. Итак, вывод, который я получаю от клиента:

connection made. 
message sent 
connection lost: Connection was closed cleanly.

И, конечно же, служба Java выдает исключение с жалобой на то, что соединение уже закрыто.

Что мне здесь не хватает?

РЕДАКТИРОВАТЬ: добавление этой строки показывает, что сообщение получено, поскольку оно правильно распечатывает:

def dataReceived(self, data):
    print(data)
    self.transport.loseConnection()

Итак, настоящая проблема в том, что функция stringReceived() не вызывается. Может у меня неправильная подпись для этой функции?


person egbokul    schedule 19.12.2011    source источник


Ответы (1)


Я кое-что понял:

def lengthLimitExceeded(self, length):
    print('length limit exceeded: {}'.format(length))

печатает:

length limit exceeded: 2147483793
length limit exceeded: 2147483793

который равен 0x80000091, поэтому кажется, что наш проприетарный API странным образом реализует протокол NString (возможно, использует MSB для чего-то еще).

person egbokul    schedule 19.12.2011
comment
На самом деле это не ответ. Вероятно, вы захотите добавить эту информацию к вопросу. - person Jean-Paul Calderone; 19.12.2011