2017-04-19 4 views
0

Dans mon application Tornado dans certains cas certains clients se déconnectent du serveur mais mon code actuel ne détecte pas que le client est déconnecté du serveur. J'utilise actuellement ping pour savoir si le client est déconnecté. ici est mon ping pong code:comment régler le délai d'attente de connexion en tornade?

from threading import Timer 
class SocketHandler(websocket.WebSocketHandler): 
    def __init__(self, application, request, **kwargs): 
     # some code here 
     Timer(5.0, self.do_ping).start() 
    def do_ping(self): 
     try: 
      self.ping_counter += 1 
      self.ping("") 
      if self.ping_counter > 2: 
       self.close() 
      Timer(60, self.do_ping).start() 
     except WebSocketClosedError: 
      pass 

    def on_pong(self, data): 
     self.ping_counter = 0 

maintenant je veux mettre SO_RCVTIMEO en tornade au lieu d'utiliser la méthode de ping-pong. Quelque chose comme ceci:
sock.setsockopt(socket.SO_RCVTIMEO)
Est-il possible de définir SO_RCVTIMEO dans Tornado pour les clients proches du serveur après un délai d'attente spécifique?

+0

@amn comment puis-je utiliser 'socket.SO_RCVTIMEO' dans Tornado? Je lis les docs mais ne peux pas trouver quelque chose d'utile. – shotgunner

Répondre

0

SO_RCVTIMEO ne fait rien dans un cadre asynchrone comme Tornado. Vous voulez probablement envelopper vos lectures dans tornado.gen.with_timeout. Vous devrez toujours utiliser des pings pour tester la connexion et vous assurer qu'elle fonctionne toujours. Si la connexion est inactive, il y a peu de garanties sur le temps qu'il faudra au système pour le remarquer. (Les keepalives TCP sont une possibilité, mais elles ne sont pas configurables sur toutes les plates-formes et utilisent généralement des délais d'attente très longs).

+0

merci. alors avec tornade nous ne pouvons pas détecter ou rafraîchir les connexions inactives? même avec le générateur 'with_timeout'? – shotgunner

+0

Vous devez utiliser une connexion périodiquement pour pouvoir détecter les échecs sur celle-ci. Cela est vrai pour TCP en général, et pas seulement pour Tornado (vous auriez besoin de quelque chose à lire pour 'SO_RCVTIMEO' pour travailler dans une application synchrone). La seule façon de détecter les échecs sans essayer d'utiliser la connexion est avec TCP keepalives, avec les limitations mentionnées ci-dessus. –

+0

Notez également que WebSocketHandler dispose désormais d'une prise en charge du ping et du timeout dans Tornado 4.5, donc pour les websockets, vous devriez l'utiliser au lieu de construire votre propre détecteur de défaillance. –