dataReceived()方法在python扭曲框架中混淆行为

时间:2012-09-30 07:46:14

标签: python twisted

我正在尝试学习python扭曲的互联网框架,但有一件事让我困惑。使用telnet进行的初始测试表明,只要接收到数据,就会调用protocol.Protocol.dataReceived()方法。因此,如果我按如下方式定义它,它会在触发之前等待EOL:

def dataReceived(self, data):
    print "MyProtocol::dataReceived, (%s)" %(data)

输出:

MyProtocol::dataReceived, (dgdfg
)

然而,只要我添加一个额外的行:

def dataReceived(self, data):
    print "MyProtocol::dataReceived, (%s)" %(data)
    self.transport.write(data)

它为每个角色开火。

输出:

MyProtocol::dataReceived, (d)
MyProtocol::dataReceived, (g)
MyProtocol::dataReceived, (d)
MyProtocol::dataReceived, (f)
MyProtocol::dataReceived, (g)
MyProtocol::dataReceived, (
)

关于这里发生了什么的任何想法?

工厂为protocol.Factory,协议为protocol.Protocol

由于

2 个答案:

答案 0 :(得分:2)

dataReceived触发(docs)之前不会进行线路缓冲,因此无法保证您收到的内容是EOL分隔的。这不太可能是您问题的根源,因为您发送的消息符合默认的读取块大小。您可以分享其余的代码吗?

您可以查看LineReceiver协议(docs),为您处理线路缓冲。这是一个例子:

from twisted.internet import reactor
from twisted.protocols import basic

class EchoLine(basic.LineReceiver):
    delimiter = '\n'  # default is '\r\n'

    def lineReceived(self, line):
        print("received: %s" % line)
        self.sendLine(line)

class EchoFactory(protocol.ServerFactory):
    protocol = EchoLine

reactor.listenTCP(port, EchoFactory())
reactor.run()

答案 1 :(得分:1)

您正在使用的客户端有时会在发送之前进行线路缓冲。也许您在两个客户端之间切换以获得缓冲行为的差异,或者您可能在客户端中切换了缓冲选项。