2013-02-20 48 views
3

我試圖使用Twisted框架寫一個服務器,並希望收到的數據進行多次扭曲內dataReceived()接收數據

class Echo(Protocol): 
    def connectionMade(self): 
     print " got connection from : " + str(self.transport.getPeer()) 

    def dataReceived(self, data): 

     ''' 
     get the client ip 
     ''' 
     if(len(data)>40): 
      ''' 
      initial setup message from the client 
      ''' 
      client_details = str(self.transport.getPeer())#stores the client IP as a string 
      i = client_details.find('\'')#process the string to find the ip 
      client_details = client_details[i+1:] 
      j = client_details.find('\'') 
      client_ip = client_details[:j] 


      ''' 
      Extract the port information from the obtained text 
      ''' 
      data = data.split('@') 
      port1 = data[0] 
      port2 = data[1] 
      port3 = data[2] 

     if int(data) == 1: 
      method1(client_ip,port1) 

     if int(data) == 2: 
      method2(client_ip,port2) 

我的問題:如果收到的方法1和方法2只叫來自客戶端的消息以及其中的適當整數數據。有沒有一種方法可以讓我等待客戶端接收dataReceived()方法中的數據,還是應該在dataReceived()方法中順序執行它?

回答

2

當收到一些數據時,會調用dataReceived方法。爲了等待更多的數據收到,你只需要從dataReceived返回,以便它可以再次被調用。

另外,TCP不是基於消息的,而是基於流的。你的dataReceived方法不能總是收到一個完整的消息,所以你的示例代碼是不正確的。扭曲矩陣實驗室網站上的See this frequently asked question以獲取更多信息。

+0

所以數據的順序將被保留,變量將被設置爲用於進一步傳入的消息? 我還沒有嘗試過這種方式,但我現在會測試它。 – hld619 2013-02-21 03:18:55

+1

在技術上,「變量」(像'x = 1'設置的東西)不會; 「屬性」(像'self.x = 1'設置的東西)將會。這是一個基本的Python問題,但與Twisted無關。 – Glyph 2013-02-22 04:46:47

+0

當你說'dataReceived不能總是收到一個完整的消息'時,它會引發另一個疑問,如果有多個客戶端在同一時間連接,客戶端發送的消息將被視爲一個單獨的流還是將不同? – hld619 2013-03-04 02:01:32