检测原始数据的结束

时间:2014-05-25 12:11:26

标签: python qt twisted

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" ); 

但是一次收到数据。

2 个答案:

答案 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提供的其他帮助器protocolsnetstringprefixed-message-length),它们将为您执行二进制框架(另请参阅SO:{{ 3}}由Twisted的作者Glyph)