1

私は最近、TCP クライアント ソケットを作成するために twisted を使用して学習しています。

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そのため、データをバッファリングするためにメソッドを手動でオーバーライドする必要があります。または、この問題のLineReceiver クラスまたはNetstringReceiver クラスのような protcol.Protocol から定義された継承クラスを使用します。

たとえば、クラス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 に答える