在python中实现超时扭曲

时间:2013-11-15 05:51:05

标签: python client-server twisted

据我所知,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()

1 个答案:

答案 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