twisted client прекращает подключение к серверу

#python #python-2.7 #twisted

#python #python-2.7 #скрученный

Вопрос:

Я использую следующий код twisted client для подключения к серверу, который отправляет данные на сервер каждые 3 секунды, и если их клиент отключен, он снова попытается подключить сервер через каждые 10 каждый. Этот клиентский код работает 24 часа. Но я заметил, что в долгосрочной перспективе клиенту не удается отправить данные на сервер, даже если сервер подключен к Сети. Я должен перезапустить этот клиентский код после завершения старого клиентского процесса, чтобы он снова заработал. Ниже приведен код, который я использую:

 #!/usr/bin/python
import binascii
from functools import partial

from twisted.internet import reactor, protocol, task
from twisted.internet.protocol import ReconnectingClientFactory

connection = None
lineNumber = 5
displayIP = '192.168.0.207'
l = None

#MAIN CLASSES FOR TCP CLIENT
class EchoClient(protocol.Protocol):
    def connectionMade(self):
        global connection
        connection = self.transport
        startClock(self)
    def dataReceived(self, data):
        self.print_message(data)

    def print_message(self, data):
        print " message received"

class EchoFactory(protocol.ReconnectingClientFactory):
    protocol = EchoClient
    maxDelay = 10

    def startedConnecting(self, connector):
        pass    

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

    def clientConnectionLost(self, conn, reason):
        global connection
        connection = None
        ReconnectingClientFactory.clientConnectionLost(self, conn, reason)

    def clientConnectionFailed(self, conn, reason):
        global connection
        connection = None
        ReconnectingClientFactory.clientConnectionFailed(self, conn, reason)


#TO SEND to server
def sendToServer(self):
    if connection:
        sendPackets(self)
    else: pass

#clock after every 3 seconds packet is send to server
def startClock(self):
    l = task.LoopingCall(partial(sendToServer,self))
    l.start(3.0)

#send current status to server
def sendPackets(self):
    try:
        self.transport.write((binascii.unhexlify(sendString)))
    except Exception, ex: pass

#THIS CONNECTS CLIENT TO server
def main():
    f = EchoFactory()
    reactor.connectTCP(displayIP, 8004, f)
    reactor.run()

#MAIN FUNCTION CALLING MODULE
if __name__ == '__main__':
    main()
  

В чем может быть проблема сбоя этого кода в долгосрочной перспективе?

Ответ №1:

Я заметил, что ведение журнала выполняется при сбое или потере соединений. Возможно, вы делаете это в своем реальном коде. reason Аргумент дает немного контекста относительно того, почему что-то не удалось, поэтому, возможно, стоит их зарегистрировать. Также вы должны resetDelay() , когда соединение потеряно / сбой, а не запускать его в buildProtocol() .

Если выполнение вышеуказанного по-прежнему не помогает выявить проблему на стороне клиента, попробуйте добавить некоторое ведение журнала на стороне сервера (если это возможно). Существует буквально бесконечное количество причин, по которым соединение «просто останавливается», и это может варьироваться от среды к среде. Если все остальное не удается, вам нужно будет использовать что-то вроде wireshark.