Python 检测原始数据的结尾

Python 检测原始数据的结尾,python,qt,twisted,Python,Qt,Twisted,有两种数据接收模式:行模式和原始模式,我们可以使用setRawMode()和setLineMode()函数在它们之间切换 线路模式检测并结束线路,然后调用lineReceived()函数 发件人: 接收到的def RAWDATA(自身、数据): 当接收到原始数据时覆盖此选项 如何Twisted检测原始数据的结尾,然后调用rawDataReceived() 编辑: 我将把这个添加到我的问题中 我正在使用这个Qt函数将数据发送到Twisted服务器 qint64 QIODevice::write(c

有两种数据接收模式:行模式和原始模式,我们可以使用
setRawMode()
setLineMode()
函数在它们之间切换

线路模式检测并结束线路,然后调用
lineReceived()
函数

发件人:

接收到的def RAWDATA(自身、数据):

当接收到原始数据时覆盖此选项

如何
Twisted
检测原始数据的结尾,然后调用
rawDataReceived()

编辑:

我将把这个添加到我的问题中

我正在使用这个Qt函数将数据发送到
Twisted
服务器

qint64 QIODevice::write(const QByteArray & byteArray)
我认为使用
write()
两次意味着Twisted服务器将触发
rawDataReceived()
函数两次

write( "raw1" );
write( "raw2" ); 

但是数据是一次性接收的。

Twisted不会检测到原始数据的结束。它只是在接收数据时调用
rawDataReceived

以下是Twisted代码的相关部分。(协议/basic.py)

def数据接收(自身,数据):
"""
已收到协议数据。
将字节转换为行,并调用lineReceived(或
已接收RAWDATA,具体取决于模式。)
"""
如果自行接收:
自身缓冲区+=数据
返回
尝试:
self.\u busyReceiving=True
自身缓冲区+=数据
当self.\u缓冲区和非self.暂停时:
如果self.line_模式:
....
其他:
数据=自身缓冲区
自身缓冲区=b''

why=self.rawDataReceived(data)#Twisted未检测到原始数据的结束。它只是在接收数据时调用
rawDataReceived

以下是Twisted代码的相关部分。(协议/basic.py)

def数据接收(自身,数据):
"""
已收到协议数据。
将字节转换为行,并调用lineReceived(或
已接收RAWDATA,具体取决于模式。)
"""
如果自行接收:
自身缓冲区+=数据
返回
尝试:
self.\u busyReceiving=True
自身缓冲区+=数据
当self.\u缓冲区和非self.暂停时:
如果self.line_模式:
....
其他:
数据=自身缓冲区
自身缓冲区=b''
why=self.rawDataReceived(data)#您问:

如何
Twisted
检测原始数据的结尾,然后调用
rawDataReceived()

简而言之,当您打开
raw
时,您的请求将被扭曲,无法检测到

。。。但让我解释一下

当您在连接内部谈论“检测数据结束”时(即,如果您没有在数据结束时关闭连接),您谈论的是一个通常被称为
帧的想法

在进行应用程序级网络编程时,框架是必须记住的主要问题之一,因为大多数(网络)协议不能保证应用程序的数据框架

令人困惑的是,许多网络协议(其中TCP是最臭名昭著的协议之一)将经常但并非总是以与传输相同的方式向接收器呈现数据(即,就好像它有帧一样,每个
将导致发生一个
,但仅在使用缓慢和低负载的情况下)。因此,它可能会起作用,也可能不会起作用。最佳实践是始终在某种框架中显式添加/构建

在TCP/串行/键盘样式的接口中添加应用程序级帧的最常用方法是使用换行符作为帧结束生成器,这就是
LineMode
的意义所在

在Twisted中打开
raw
模式就像说“我想写我自己的框架”,但我怀疑这是否真的是你想要的

相反,您可能想看看Twisted提供的其他一些帮助程序(,),它们将为您提供二进制帧(也请参见:by Twisted的作者Glyph)

您问:

如何
Twisted
检测原始数据的结尾,然后调用
rawDataReceived()

简而言之,当您打开
raw
时,您的请求将被扭曲,无法检测到

。。。但让我解释一下

当您在连接内部谈论“检测数据结束”时(即,如果您没有在数据结束时关闭连接),您谈论的是一个通常被称为
帧的想法

在进行应用程序级网络编程时,框架是必须记住的主要问题之一,因为大多数(网络)协议不能保证应用程序的数据框架

令人困惑的是,许多网络协议(其中TCP是最臭名昭著的协议之一)将经常但并非总是以与传输相同的方式向接收器呈现数据(即,就好像它有帧一样,每个
将导致发生一个
,但仅在使用缓慢和低负载的情况下)。因此,它可能会起作用,也可能不会起作用。最佳实践是始终在某种框架中显式添加/构建

在TCP/串行/键盘样式的接口中添加应用程序级帧的最常用方法是使用换行符作为帧结束生成器,这就是
LineMode
的意义所在

在Twisted中打开
raw
模式就像说“我想写我自己的框架”,但我怀疑这是否真的是你想要的

相反,您可能想看看Twisted提供的其他一些帮助器(,),它们将为您进行二进制成帧(也请参见:by Twisted的作者Glyph)

如何定义“原始数据的结束”?本质上,如@falsetru所示,
setRawMode()
将您的协议切换回“流式”接收。@oberstet我已进行了编辑
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