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