Получение ввода командной строки при прослушивании подключений в Python

#python #sockets #client #twisted

#python #сокеты #клиент #twisted

Вопрос:

Я пытаюсь написать программу, к которой подключаются клиенты, пока сервер все еще может отправлять команды всем клиентам. Я использую «искаженное» решение. Как я могу это сделать? Вот код, который у меня есть на данный момент (я понимаю, что Twisted уже использует неблокирующие сокеты):

 import threading
print 'threading.'

def dock():
   try:
       from twisted.internet.protocol import Factory, Protocol
       from twisted.internet import reactor
       import currentTime
       print '[*]Imports succesful.'
   except:
       print '[/]Imports failed.'

   #Define the class for the protocol
   class Master(Protocol):
       command = raw_input('> ')
       def connectionMade(self):
           print 'Slave connected.'
           print currentTime.getTime() #Print current time
           #self.transport.write("Hello")

       def connectionLost(self, reason):
           print 'Lost.'
   #Assemble it in a "factory"

   class MasterFactory(Factory):
       protocol = Master


   reactor.listenTCP(8800, MasterFactory())

   #Run it all
   reactor.run()

def commandline():
   raw_input('>')

threading.Thread(target=dock()).start()
threading.Thread(target=commandline()).start()
  

Ответ №1:

Поскольку вы уже используете twisted, вам также следует использовать его для консольной части, вместо использования raw_input в потоке.

Цикл событий Twisted может отслеживать изменения в любом файловом дескрипторе, включая стандартный ввод, поэтому вы можете получать обратные вызовы на основе событий при введении новой строки — он работает асинхронно без необходимости в потоках.

Я нашел этот пример интерактивной консоли в приложении twisted, возможно, вы сможете его использовать.

Комментарии:

1. @alex luoqq.blogspot.com.br/2012/01 /…

2. .com.br содержит нечитаемые примеры кода для меня. Но веб-архив www.oluyede.org/blog/2008/08/31/twisted-interactive-console работает