2013-02-20 2 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) 

Мой вопрос: method1 и method2 называются только тогда, когда он получает сообщение от клиента с соответствующими целыми данными в нем. Есть ли способ, которым я могу ждать на клиенте для получения данных внутри метода dataReceived(), или я должен просто делать это последовательно в самом методе dataReceived()?

ответ

2

Метод dataReceived вызывается, когда некоторые данные получены. Чтобы ждать получения большего количества данных, вам просто нужно вернуться с dataReceived, чтобы его можно было вызвать снова.

Кроме того, TCP не основан на сообщениях, он основан на потоках. Ваш метод dataReceived не может рассчитывать на получение полного сообщения, поэтому ваш примерный код неверен. See this frequently asked question на веб-сайте Twisted Matrix Labs для получения дополнительной информации.

+0

так будет сохранен порядок данных и будут установлены переменные для использования для последующих входящих сообщений? Я не пробовал это так, но сейчас проверю. – hld619

+1

технически «переменные» (вещи, установленные как 'x = 1') не будут; «атрибуты» (вещи, установленные как 'self.x = 1'). Это основная проблема Python, но не имеет ничего общего с Twisted. – Glyph

+0

Когда вы говорите, что «dataReceived не может рассчитывать на получение полного сообщения», возникает еще одно сомнение, если одновременно подключено несколько клиентов, будут ли сообщения, отправленные клиентами, рассматриваться как один поток или будут отличаться? – hld619

Смежные вопросы