python twisted框架中的dataReceived()方法混淆行为

python twisted框架中的dataReceived()方法混淆行为,python,twisted,Python,Twisted,我试图学习python扭曲的互联网框架,但有一件事让我困惑。使用telnet进行的初始测试表明,无论何时接收数据,都会调用protocol.protocol.dataReceived方法。因此,如果我将其定义如下,它将在触发之前等待EOL: def dataReceived(self, data): print "MyProtocol::dataReceived, (%s)" %(data) 输出: MyProtocol::dataReceived, (dgdfg ) MyProto

我试图学习python扭曲的互联网框架,但有一件事让我困惑。使用telnet进行的初始测试表明,无论何时接收数据,都会调用protocol.protocol.dataReceived方法。因此,如果我将其定义如下,它将在触发之前等待EOL:

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

MyProtocol::dataReceived, (dgdfg
)
MyProtocol::dataReceived, (d)
MyProtocol::dataReceived, (g)
MyProtocol::dataReceived, (d)
MyProtocol::dataReceived, (f)
MyProtocol::dataReceived, (g)
MyProtocol::dataReceived, (
)
但是,只要我添加一行额外内容:

def dataReceived(self, data):
    print "MyProtocol::dataReceived, (%s)" %(data)
    self.transport.write(data)
它为每个角色开火

输出:

MyProtocol::dataReceived, (dgdfg
)
MyProtocol::dataReceived, (d)
MyProtocol::dataReceived, (g)
MyProtocol::dataReceived, (d)
MyProtocol::dataReceived, (f)
MyProtocol::dataReceived, (g)
MyProtocol::dataReceived, (
)
你知道这里发生了什么吗

工厂是协议工厂,协议是协议工厂


谢谢

行缓冲不会在dataReceived激发之前发生,因此不能保证您接收的是EOL分隔的。不过,这不太可能是问题的根源,因为您发送的消息符合默认的读取区块大小。你能分享一下你剩下的代码吗

有一个LineReceiver协议,您可以研究它,它为您处理行缓冲。下面是一个例子:

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()

行缓冲不会在dataReceived激发之前发生,因此不能保证您接收的是EOL分隔的。不过,这不太可能是问题的根源,因为您发送的消息符合默认的读取区块大小。你能分享一下你剩下的代码吗

有一个LineReceiver协议,您可以研究它,它为您处理行缓冲。下面是一个例子:

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()

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

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