2014-02-06 55 views
0

我在我的雙絞線服務器中使用雙絞線呼叫在特定的時間間隔後再呼叫一次。我的代碼如下:只運行一個雙絞線呼叫

class Echo(LineReceiver): 

    def connectionMade(self): 
     self.factory.clients.append(self) 
     self.setRawMode() 
     startClock(self) 
     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 = ["%02X"%ord(inp) for inp in data] 
     if(CheckPacket(inputArray)): 
      PacketParser(inputArray, self) 
     else: 
      print "Fail" 
      d = self.transport.getHost() 
      print d.type 

def startClock(self): 
    l = task.LoopingCall(partial(sendTimeRequest,self)) 
    l.start(660.0) 

def main(): 
    port = 8000 
    factory = protocol.ServerFactory() 
    factory.protocol = Echo 
    factory.clients = [] 
    try: 
     reactor.listenTCP(port,factory) 
    except Exception, ex: 
     print "Port %d is busy: %s" % (port, ex) 
    reactor.run() 

因此,我的問題是,每當新客戶端連接到服務器一個新的循環呼叫將啓動。我如何確保它們只有一個循環調用正在運行,即使它們不止一個客戶端連接到服務器?目前它的發生方式如下,當第一個客戶端連接到服務器時,一個雙絞線循環呼叫開始,每隔10秒呼叫一次,然後調用函數a()。然後在2秒鐘之後另一個客戶端連接到服務器,然後另一個循環呼叫在每10秒鐘開始調用函數a(),但最後它變成這樣:

逝去的時間|功能稱爲

10秒| a()

12秒| a()

20秒| a()

22秒| a()

但我希望函數a()僅在每10秒後調用,而不考慮否。的客戶端連接到服務器。

+0

'在特定時間間隔後調用一次'? –

+0

他們應該只有一個循環呼叫正在運行,而現在每當新客戶端連接到服務器時,一個新的循環呼叫開始。 – prattom

+0

questiom底部有一個編輯按鈕。請修復這個問題。 :)如果不清楚,這個問題的語法似乎打破了我。我不明白你想傳達什麼。 –

回答

0

每個連接有一個Protocol實例。在建立連接時,每個實例都調用connectionMade方法。

此方法:

def connectionMade(self): 
    self.factory.clients.append(self) 
    self.setRawMode() 
    startClock(self) 

稱爲每次連接一次,因此startClock每個連接調用一次。

與此相對的是您的main函數。它只被調用一次。如果您撥打main撥打startClock並從connectionMade中取出,則startClock只會被調用一次。它將在任何連接建立之前在程序啓動時被調用,並且永不再次。

注意到代碼已經維持在工廠實例Protocol實例的列表。這意味着,如果提及工廠,則可以訪問所有Protocol實例。這意味着如果您將工廠作爲參數傳遞給正在循環的函數...

+0

如果我將startclock移動到main,我該如何傳遞自己的對象? – prattom

+0

你說你想要一個循環,你沒有說你想循環做什麼。 –

+0

對不起,我想我沒有清楚地說明我的問題。 – prattom