4

私が知っている限り、twisted は非同期でイベント駆動型であり、誰かがタイムアウトの必要はないと言っていました。2分ごとにデータをサーバーに送信する組み込みマシンである100を超えるクライアントに接続されるサーバーアプリケーションを構築する必要があり、各パケットまたはデータのサイズは238〜1500バイトになります。したがって、実際のケースでは、tcp はデータを複数のパケットに分割するため、タイムアウトを実装する必要があるか、twisted がそのような状況を処理します。私は新しいねじれたので、どんなアドバイスでも。タイムアウトのないサーバー用の次のコードがあります。タイムアウトの終わりに、接続が生きている間に完全なパケットが受信されない場合、パケットを破棄したいだけです。

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()
4

1 に答える 1

3

@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
于 2013-12-13T22:06:34.997 に答える