2008-10-21 13 views
8

मुझे एहसास है कि मैं शायद सिर्फ गूंगा हूं और कुछ बड़ा और महत्वपूर्ण याद कर रहा हूं, लेकिन मैं यह नहीं समझ सकता कि रिएक्टर.listenUDP का उपयोग करके टकराए गए समय को कैसे निर्दिष्ट किया जाए। मेरा लक्ष्य एक टाइमआउट निर्दिष्ट करने में सक्षम होना है, और कहा गया समय के बाद, यदि डेटाग्रामप्रोटोकॉल.datagramReceived निष्पादित नहीं किया गया है, तो इसे एक कॉलबैक निष्पादित करें या कुछ जिसे मैं reoror.stop() को कॉल करने के लिए उपयोग कर सकता हूं। किसी भी मदद या सलाह की सराहना की है। धन्यवादक्या ट्विस्ट में सॉकेट पर टाइमआउट सेट करना संभव है?

उत्तर

5

चूंकि टिक्स्ड घटना संचालित है, आपको प्रति टाइमआउट की आवश्यकता नहीं है। आप बस एक राज्य चर (datagramRecieved की तरह) की स्थापना की है जब आप एक आंकड़ारेख प्राप्त करते हैं और रजिस्टर एक looping call कि राज्य चर की जाँच करता है की जरूरत है, रिएक्टर बंद हो जाता है, तो उचित तो राज्य चर को साफ करता है:

from twisted.internet import task 
from twisted.internet import reactor 

datagramRecieved = False 
timeout = 1.0 # One second 

# UDP code here 

def testTimeout(): 
    global datagramRecieved 
    if not datagramRecieved: 
     reactor.stop() 
    datagramRecieved = False 


l = task.LoopingCall(testTimeout) 
l.start(timeout) # call every second 

# l.stop() will stop the looping calls 
reactor.run() 
13

मुझे लगता है कि reactor.callLater बेहतर काम करेगा LoopingCall से अधिक। कुछ इस तरह:

class Protocol(DatagramProtocol): 
    def __init__(self, timeout): 
     self.timeout = timeout 

    def datagramReceived(self, datagram): 
     self.timeout.cancel() 
     # ... 

timeout = reactor.callLater(5, timedOut) 
reactor.listenUDP(Protocol(timeout)) 
3

रिएक्टर के साथ हमें कॉललेटर का उपयोग करना होगा। कनेक्शनमेड होने पर स्टार्ट टाइमआउट उलटी गिनती। लाइन प्राप्त होने पर टाइमआउट उलटी गिनती रीसेट करें।

यहाँ

# -*- coding: utf-8 -*- 

from twisted.internet.protocol import Factory 
from twisted.protocols.basic import LineReceiver 
from twisted.internet import reactor, defer 

_timeout = 27 


class ServiceProtocol(LineReceiver): 

    def __init__(self, users): 
     self.users = users 


    def connectionLost(self, reason): 
     if self.users.has_key(self.name): 
      del self.users[self.name] 

    def timeOut(self): 
     if self.users.has_key(self.name): 
      del self.users[self.name] 
     self.sendLine("\nOUT: 9 - Disconnected, reason: %s" % 'Connection Timed out') 
     print "%s - Client disconnected: %s. Reason: %s" % (datetime.now(), self.client_ip, 'Connection Timed out') 
     self.transport.loseConnection() 

    def connectionMade(self): 
     self.timeout = reactor.callLater(_timeout, self.timeOut) 

     self.sendLine("\nOUT: 7 - Welcome to CAED") 

    def lineReceived(self, line): 
     # a simple timeout procrastination 
     self.timeout.reset(_timeout) 

class ServFactory(Factory): 

    def __init__(self): 
     self.users = {} # maps user names to Chat instances 

    def buildProtocol(self, addr): 
     return ServiceProtocol(self.users) 

port = 8123 
reactor.listenTCP(port, ServFactory()) 
print "Started service at port %d\n" % port 
reactor.run() 
0

एक बेहतर इस twisted.protocols.policies.TimeoutMixin साथ है करने के लिए रास्ता नहीं है। यह अनिवार्य रूप से callLater कर रहा है लेकिन Mixin में वर्गीकृत है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^