Twisted有两种数据接收模式:线路模式和原始模式,我们可以使用setRawMode()
和setLineMode()
功能在它们之间切换。
线路模式检测到行尾,然后调用lineReceived()
函数。
来自Twisted doc:
def rawDataReceived(self,data):
在收到原始数据时覆盖此内容。
Twisted
如何检测原始数据的结尾然后调用rawDataReceived()
?
修改
我将添加此内容以完成我的问题。
我使用此Qt功能将数据发送到Twisted
服务器
qint64 QIODevice::write(const QByteArray & byteArray)
我认为使用write()
两次意味着Twisted服务器也会触发两次rawDataReceived()
函数。
write( "raw1" );
write( "raw2" );
但是一次收到数据。
答案 0 :(得分:2)
Twisted没有检测到原始数据的结束。它只是在接收数据时调用rawDataReceived
。
以下是Twisted代码的相关部分。 (协议/ basic.py )
def dataReceived(self, data):
"""
Protocol.dataReceived.
Translates bytes into lines, and calls lineReceived (or
rawDataReceived, depending on mode.)
"""
if self._busyReceiving:
self._buffer += data
return
try:
self._busyReceiving = True
self._buffer += data
while self._buffer and not self.paused:
if self.line_mode:
....
else:
data = self._buffer
self._buffer = b''
why = self.rawDataReceived(data) # <--------
if why:
return why
finally:
self._busyReceiving = False
答案 1 :(得分:2)
你问:
Twisted
如何检测原始数据的结尾然后调用rawDataReceived()
?
简而言之,当您启用raw
时,您的要求Twisted 无法检测到。
...但是让我解释一下
当你谈到'检测连接内 中的数据结束时(如果你没有在数据末尾关闭连接,IE就是IE),你谈论的是一个通常被称为的想法为framing
。
框架是您在进行应用程序级网络编程时必须牢记的主要问题之一,因为大多数(网络)协议不保证数据框架到应用程序< / strong>即可。
令人困惑的是,许多网络协议(其中TCP是最臭名昭着的协议之一)将 经常但不总是 以与传输时相同的方式向接收方提供数据(IE好像它有框架,每个write
将导致一个read
发生 - 但在使用缓慢和低负载的情况下仅。由于这可能是工作 - 可能 - 它不会行为,最好的做法是始终明确地添加/构建某种框架。
在TCP /串行/键盘样式界面中添加应用程序级别框架的最常用方法是使用换行符作为帧末制作者,这就是LineMode
的内容。
打开Twisted中的raw
模式就像是说'我想写自己的框架',但我怀疑那是你真正想要的。
相反,您可能希望查看Twisted提供的其他帮助器protocol
s(netstring,prefixed-message-length),它们将为您执行二进制框架(另请参阅SO:{{ 3}}由Twisted的作者Glyph)