2015-11-12 7 views
1

Привет, Я пытаюсь реализовать базовый серверный клиент с использованием скрученного. Мой сервер - это ПК, а клиенты - это небольшие встроенные устройства, которые будут общаться через UDP через Wi-Fi. Вот очень маленькая реализация я с использованием примеровМножество клиентов Twisted UDP Server

from twisted.internet.protocol import DatagramProtocol 
from twisted.internet import protocol, reactor 
import time 
from socket import SOL_SOCKET, SO_BROADCAST 

class Echo(protocol.DatagramProtocol): 
    def datagramReceived(self, data, (host, port)): 
     while(1): 
      self.transport.write(data, (host, port)) 
      ##Recieve Some thing here on the current ip 
      ##Perform some task have to send and recieve couple of 
      ##times 
      time.sleep(3) 

    def main(): 

     reactor.listenUDP(8000, Echo()) 
     reactor.run() 
     print 'Reactor running\n' 
     #protocol.startProtocol() 
     while(1): 
      command_input = input("Enter your Command ") 
      if command_input == exit: 
       print 'Exiting' 
       exit() 

if __name__ == '__main__': 
    main() 

я буду получать пакет от клиента, то я должен буду отправить некоторые данные обратно, а затем снова клиент будет отправлять какие-то данные, и это будет продолжать для некоторых в то время как. Есть ли способ сделать это в функции datagramRecieved() и одновременно обслуживать другие клиенты. В этой реализации после вызова функции datagramRecieved() я не могу получить что-либо еще, пока не вернется. Существует концепция фабрик (используется в tcp, я думаю), она может быть реализована здесь.

ответ

0

Чтобы получить эффект здесь, когда вы отправляете пакет каждые 3 секунды, вы хотите использовать LoopingCall. Фактически, если вы, например, sleep, в зависимости от размера различных буферов, вы можете даже не отправлять эти пакеты вообще, пока не вернетесь в реактор; записи - это событие, подобное чтению.

Пример того, как это может работать:

from twisted.internet import protocol, task 
class Echo(protocol.DatagramProtocol): 
    def datagramReceived(self, data, (host, port)): 
     def reply(): 
      self.transport.write(data, (host, port)) 
     task.LoopingCall(reply).start(3.0) 

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

  • Нет связанных вопросов^_^