简体   繁体   English

定期递延扭曲

[英]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. 您已经有一个函数printValueprintValue在接收到值并应打印时运行。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM