2015-01-20 4 views
1

내 문제는 다음과 같습니다. Twisted Server가 있으며, callLater를 사용하여 TCP를 통해 2 초마다 값을 전송합니다. 그리고 나는 값을받는 트위스트 클라이언트를 가지고 있으며 지연된 값으로 수신 값을 처리해야합니다.Twisted 주기적 호출로 연기 됨

내 서버는 다음과 같습니다

from twisted.internet.protocol import ServerFactory 
from twisted.protocols.basic import NetstringReceiver 
from random import randint 

class ServerProtocol(NetstringReceiver): 
    def __init__(self, factory): 
     self.factory = factory 
     self.sendObject = None 

    def connectionMade(self):   
     self.sendValue() 

    def connectionLost(self, reason): 
     sendObject, self.sendObject = self.sendObject, None 
     sendObject.cancel() 

    def sendValue(self): 
     data = randint(2,20) 
     self.sendString(str(data)) 
     print('send: {0}'.format(data)) 

     from twisted.internet import reactor 
     self.sendObject = reactor.callLater(2, self.sendValue) 

class MyServerFactory(ServerFactory): 

    def __init__(self): 
     self.protsa = [] 

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

    def setCallback(self, callback): 
     self.callback = callback  

def serverMain(): 

    factory = MyServerFactory() 
# factory.setCallback(generateVal) 

    from twisted.internet import reactor 

    port = reactor.listenTCP(2345, factory, interface='127.0.0.1')  
    print 'Serving on %s.' % (port.getHost()) 

    reactor.run() 


if __name__ == '__main__': 
    serverMain() 

내 고객은 다음과 같습니다

from twisted.internet.protocol import ClientFactory 
from twisted.protocols.basic import NetstringReceiver 
from twisted.internet import defer 


class ClientProtocol(NetstringReceiver): 

    def stringReceived(self, string): 
     print("recieved") 
     self.factory.printValue(string) 

    def connectionMade(self): 
     print("Made Connection") 

    def connetionLost(self): 
     print("Connection Lost") 

class MyClientFactory(ClientFactory): 

    protocol = ClientProtocol 

    def __init__(self, deferred): 
     self.deferred = deferred 

    def clientConnectionFailed(self, connector, reason): 
     if self.deferred is not None: 
      d, self.deferred = self.deferred, None 
      d.errback(reason) 

    def printValue(self, value): 
     if self.deferred is not None: 
      d, self.deferred = self.deferred, None 
      d.callback(value) 


def OutputValue(host, port): 
    d = defer.Deferred() 
    from twisted.internet import reactor 
    factory = MyClientFactory(d) 
    reactor.connectTCP(host, port, factory) 
    return d 

def clientMain(): 

    def writeError(err): 
     print("Deferred Error!\n") 
     print("Error: {0}".format(err.__str__)) 

    def writeValue(value): 
     print("Value revieved: {0}".format(value)) 

    from twisted.internet import reactor 

    d = OutputValue('127.0.0.1', 2345) 
    d.addCallbacks(writeValue, writeError) 

    reactor.run() 

if __name__ == '__main__': 
    clientMain() 

출력 : 모든 것이 잘 작동 처음으로

Made Connection 
recieved 
Value revieved: 11 
recieved 
recieved 
recieved 

합니다. 연결 후 서버는 클라이언트가받는 값을 보냅니다. 클라이언트는 원하는대로 연기합니다. 두 번째 값은 지연에 의해 처리되지 않습니다. 나는 또한 연기가 한 번만 해고되기 때문에 그것을 기대했다. 이제 지연된 모든 수신 값을 처리 할 수있는 가능성이 있으므로 오류 처리도 할 수 있습니다.

나는 이것 좀했다 :

Twisted: deferred that fires repeatedly

Re-using deferred objects in Twisted

을하지만 난 내 문제에 대한 해결책의 보류를 얻을 수 없습니다. 이례적인 것은 아닙니다. 또는 매번 연결을 끊고 연결해야합니까?

답변

0

지연은 사용자가 작성한 특정 요청의 결과를 나타내는 개체입니다. 그러나 요청에는 하나의 연관된 응답 만있을 수 있기 때문에 함수가 한 번만 반환하는 것과 같은 방식으로 지연은 한 번만 실행될 수 있습니다.

값을 받았을 때 실행되고 인쇄해야하는 기능 - printValue이 이미 있습니다. 발신자가 설정 한 Deferred를 찾으러가는 것보다 그 기능의 값을 즉시 인쇄하는 것이 어떻습니까?

+0

내가 만든 코드가 지연을 통해 하나의 반환 값만 제공한다는 것을 완전히 알고 있습니다. 하지만 난 그냥 뒤틀린 학습이 일을했다 : http://krondo.com/?page_id=1327 튜토리얼. 왜곡되지 않은 적절한 오류 처리는 지연을 사용하는 것만 가능하다는 인상을 받았습니다. 그래서이 경우에도 지연을 사용하고 싶었습니다. – MightyAsator

+0

Python에서는 간단하게'try :'/'except :'를 사용하여 에러를 처리 할 수 ​​있습니다. 이 경우 Deferred를 사용하면 많이 사지 않습니다. – Glyph