Python - Twisted 客户端 - dataRecived 方法中的最大数据大小

Python - Twisted client - Maximum size of data in dataRecived method

我最近一直在使用和学习 twisted 来创建 TCP 客户端套接字。

我得到了 Protocol class 的 dataRecived 方法,returns 所有数据在一起。这意味着所有数据相互连接,最后 returns 来自服务器的长字节数据。

代码:

from twisted.internet.protocol import Protocol

class ClientProtocol(Protocol):
    def connectionMade(self):
        self.transport.write(b'a')

    def dataReceived(self, data):
        print ('data', data)

所以现在我的问题是:

  1. dataRecived方法任何数据的最大大小吗?或者它的大小是无限

  2. 如果它有最大尺寸,那是什么?我该如何覆盖它?

Note: I'm using Ubuntu 14.04, Python v3.4 and Twisted v15.3.0.

根据 Twisted DocumentationdataRecived 方法中的 data 参数 不是无限制的 而是:

" 不确定长度的字符串。请记住,您可能需要缓冲一些数据,因为可能会收到部分(或多个)协议消息!"。

所以我们需要手动覆盖 dataRecived 方法来缓冲数据。或者使用一些定义的继承 class from protcol.Protocol 像:LineReceiver class or NetstringReceiver class 来解决这个问题。

例如 dataReceived LineRecevier class 的来源如下:

 def dataReceived(self, data):
        """Protocol.dataReceived.
        Translates bytes into lines, and calls lineReceived (or
        rawDataReceived, depending on mode.)
        """
        self.__buffer = self.__buffer+data
        while self.line_mode and not self.paused:
            try:
                line, self.__buffer = self.__buffer.split(self.delimiter, 1)
            except ValueError:
                if len(self.__buffer) > self.MAX_LENGTH:
                    line, self.__buffer = self.__buffer, ''
                    return self.lineLengthExceeded(line)
                break
            else:
                linelength = len(line)
                if linelength > self.MAX_LENGTH:
                    exceeded = line + self.__buffer
                    self.__buffer = ''
                    return self.lineLengthExceeded(exceeded)
                why = self.lineReceived(line)
                if why or self.transport and self.transport.disconnecting:
                    return why
        else:
            if not self.paused:
                data=self.__buffer
                self.__buffer=''
                if data:
                    return self.rawDataReceived(data)