我正在尝试学习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, (
)
对这里发生的事情有任何想法吗?
行缓冲不会在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()
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。