2016-10-20 2 views
0

다음 트위스트 클라이언트 코드를 사용하여 매 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() 

이 코드가 장기적으로 실패하면 어떤 문제가 발생할 수 있습니까?

답변

0

연결이 실패하거나 손실 된 경우 로깅이 수행됩니다. 실제 코드에서이 작업을 수행 할 수 있습니다. reason 인수는 일이 실패한 이유에 대한 약간의 컨텍스트를 제공하므로 로그 할 가치가 있습니다. buildProtocol()에서 실행하는 것과 반대로 연결이 끊어 지거나 실패하면 resetDelay()을 사용해야합니다.

위의 작업을 수행해도 클라이언트 측에서 문제가 발견되지 않으면 가능한 경우 서버 측에 일부 로깅을 추가하십시오. 문자 그대로 무한한 이유가 연결이 "막 멈추는"이유는 매우 환경에서 환경에 있습니다. 다른 모든 것이 실패하면 wireshark와 같은 것을 사용할 필요가 있습니다.

관련 문제