我正在尝试学习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
由于
答案 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)
您正在使用的客户端有时会在发送之前进行线路缓冲。也许您在两个客户端之间切换以获得缓冲行为的差异,或者您可能在客户端中切换了缓冲选项。