【问题标题】:Python - Twisted client - Maximum size of data in dataRecived methodPython - 扭曲的客户端 - dataRecived 方法中的最大数据大小
【发布时间】:2015-09-05 02:53:04
【问题描述】:

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

我得到了Protocol 类的dataRecived 方法,将所有数据一起返回。表示所有数据相互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。

【问题讨论】:

    标签: python python-3.x tcpclient twisted.internet twistd


    【解决方案1】:

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

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

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

    例如dataReceivedLineRecevier类的来源如下:

     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)
    

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2012-09-13
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多