내 문제는 다음과 같습니다. 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
을하지만 난 내 문제에 대한 해결책의 보류를 얻을 수 없습니다. 이례적인 것은 아닙니다. 또는 매번 연결을 끊고 연결해야합니까?
내가 만든 코드가 지연을 통해 하나의 반환 값만 제공한다는 것을 완전히 알고 있습니다. 하지만 난 그냥 뒤틀린 학습이 일을했다 : http://krondo.com/?page_id=1327 튜토리얼. 왜곡되지 않은 적절한 오류 처리는 지연을 사용하는 것만 가능하다는 인상을 받았습니다. 그래서이 경우에도 지연을 사용하고 싶었습니다. – MightyAsator
Python에서는 간단하게'try :'/'except :'를 사용하여 에러를 처리 할 수 있습니다. 이 경우 Deferred를 사용하면 많이 사지 않습니다. – Glyph