2

我正在尝试学习 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

谢谢

4

2 回答 2

3

行缓冲不会在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()
于 2012-09-30T09:26:09.200 回答
1

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

于 2012-09-30T12:12:27.820 回答