1

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

我得到了类的dataRecived方法Protocol,将所有数据一起返回。这意味着所有数据相互ConCat,最后从服务器返回一个长字节数据。

代码:

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. 如果它有最大尺寸,那是什么?我怎样才能覆盖它?

注意:我使用的是 Ubuntu 14.04、Python v3.4 和 Twisted v15.3.0。

4

1 回答 1

1

根据Twisted Documentation,方法中的data参数不是无限的,它是:dataRecived

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

所以我们需要dataRecived手动重写方法来缓冲数据。或者使用一些从 protcol.Protocol 定义的继承类,例如:LineReceiver 类NetstringReceiver 类来解决这个问题。

例如类的dataReceived来源LineRecevier如下:

 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)
于 2015-09-03T16:46:43.267 回答