据我所知,twisted是异步和事件驱动的,有人告诉我他们不需要超时。我必须构建一个服务器应用程序,它将连接到100多个客户端,这些客户端是嵌入式机器每2分钟向服务器发送一次数据,每个数据包或数据的大小为238-1500字节。因此就是现实生活中的情况tcp会将数据分成多个数据包,因此他们任何需要实现超时或扭曲都会处理这种情况。任何建议,因为我是新的扭曲。我没有超时我的服务器的代码。在超时结束时,我只想丢弃数据包,如果在连接保持活动状态时没有收到完整的数据包。
class Server(LineReceiver):
def connectionMade(self):
self.factory.clients.append(self)
self.setRawMode()
self._peer = self.transport.getPeer()
print 'Connected Client', self._peer
def connectionLost(self, reason):
self.factory.clients.remove(self)
print 'Lost connection from', self._peer
def rawDataReceived(self, data):
inputArray = [ord(inp) for inp in data]
#do something
def main():
"""This runs the protocol on port 8000"""
factory = protocol.ServerFactory()
factory.protocol = Server
factory.clients = []
reactor.listenTCP(8000,factory)
reactor.run()
答案 0 :(得分:2)
正如@Ashish Nitin Patil建议的那样,只需切断连接即可实现超时:
from twisted.internet import reactor
# ...
def connectionMade(self):
# ... your code
# cancel connection in 2 minutes
reactor.callLater(120, self.transport.loseConnection)
或者
在超时结束时,我只想在连接保持活动状态时未收到完整数据包时丢弃数据包。
如果你不想在超时时取消连接,那么:
from time import time as timer
def connectionMade(self):
# ... your code
self.endtime = timer() + 120 # timeout in 2 minutes
def dataReceived(self, data):
if timer() > self.endtime: # timeout
if not self.have_we_received_full_packet()
return # do nothing (discard data, the connection remains alive)
else:
# timeout happened but we have a full packet, now what?
inputArray = bytearray(data)
#do something