2016-10-20 18 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のようなものを使用する必要があります。

関連する問題