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)
所以现在我的问题是:
有dataRecived
方法任何数据的最大大小吗?或者它的大小是无限?
如果它有最大尺寸,那是什么?我该如何覆盖它?
Note: I'm using Ubuntu 14.04, Python v3.4 and Twisted v15.3.0.
根据 Twisted Documentation , dataRecived
方法中的 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)
我最近一直在使用和学习 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)
所以现在我的问题是:
有
dataRecived
方法任何数据的最大大小吗?或者它的大小是无限?如果它有最大尺寸,那是什么?我该如何覆盖它?
Note: I'm using Ubuntu 14.04, Python v3.4 and Twisted v15.3.0.
根据 Twisted Documentation , dataRecived
方法中的 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)