开发者社区> 问答> 正文

dataReceived()方法在python扭曲框架中的行为令人困惑

我正在尝试学习python扭曲的Internet框架,但有一件事使我感到困惑。使用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, (
)

对这里发生的事情有任何想法吗?

展开
收起
祖安文状元 2020-02-23 16:27:28 904 0
1 条回答
写回答
取消 提交回答
  • 行缓冲不会在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()
    
    2020-02-23 16:27:35
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载