[英]Twisted Deferred with periodical calls
My Problem looks like this: I have a Twisted Server, which sends values every 2 seconds over TCP with callLater. 我的问题看起来像这样:我有一个Twisted Server,它使用callLater通过TCP每2秒发送一次值。 And I have a twisted client, which recieves the values and should handle the recieving value with a deferred. 而且我有一个扭曲的客户,它可以接收值,并且应该延迟处理接收值。
My Server looks like this: 我的服务器看起来像这样:
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()
My Client looks like this: 我的客户看起来像这样:
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()
Output: 输出:
Made Connection
recieved
Value revieved: 11
recieved
recieved
recieved
For the first time everything works fine. 第一次一切正常。 After connection the server sends a value which the client recieves. 连接后,服务器发送一个客户端接收的值。 The client handels the with a deferred as wished. 客户端按要求延迟处理。 The second value are not handled by the deferred. 第二个值不由延迟处理。 I also expected that because the deferred are only fired once. 我也希望这样做,因为延期只开了一次。 Now I would like to have a possibility to handle every recieved value by a deferred, so I can also do error handling. 现在,我希望可以按递延方式处理每个收到的值,因此我也可以执行错误处理。
I had a look at this: 我看了一下:
Twisted: deferred that fires repeatedly 扭曲:推迟发射多次
Re-using deferred objects in Twisted 重用Twisted中的延迟对象
but I cannot get hold of a solution for my problem. 但我无法解决我的问题。 This can't be so unusual. 这不是那么寻常。 Or do I have to disconnect and connect every time? 还是我每次都必须断开连接并连接?
A Deferred is an object which represents the result of a specific request that you are making. Deferred是一个对象,代表您提出的特定请求的结果。 But since a request can only have one associated response, in the same way that a function can only return once, a Deferred can only be fired once. 但是,由于一个请求只能有一个关联的响应,就像一个函数只能返回一次一样,一个Deferred只能被触发一次。
You already have a function - printValue
- which is run when a value is received and should be printed. 您已经有一个函数printValue
该printValue
在接收到值并应打印时运行。 Why not just print the value in that function right away, rather than going looking for a Deferred which your caller set up? 为什么不立即打印该函数中的值,而不是寻找呼叫者设置的Deferred?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.